使用 swift 中的委托将数据从一个自定义 uitableviewcell 传递到另一个

Passing data from one custom uitableviewcell to another using Delegates in swift

好的,我有一个 UIPicker 自定义单元格,我想将“didSelectRow”上的所选项目传递给另一个自定义单元格,我尝试使用委托来执行此操作,但问题是我无法设置委托作为接收方自定义单元格(到我想要接收数据的单元格),所以..这是我的代码:

UIPickerView 单元格:

import UIKit

protocol AlbumsPickerCellDelegate {
    func didSelectedAlbum(_ selectedAlbum: String)
}

class AlbumsPickerTableViewCell: UITableViewCell {

//    var indexPath: IndexPath!

    @IBOutlet var albumsPicker: UIPickerView!
    
    
    var pickerData = ["Album1", "Album2", "Album3"]
    var albumsPickerCellDelegate:  AlbumsPickerCellDelegate?
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.albumsPicker.delegate = self
        self.albumsPicker.dataSource = self
    }

    
    
    class func cellHeight() -> CGFloat {
        return 162.0
    }
    
    
}

extension AlbumsPickerTableViewCell: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1

    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerData[row]
    }
    
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print(pickerData[row])
        //TODO: Pass the selected data to the albumCell to update the label:
        let selectedAlbumOption = pickerData[row]
        print("Selected Item: \(selectedAlbumOption)")
        
        if let delegate = albumsPickerCellDelegate {
            delegate.didSelectedAlbum(selectedAlbumOption)
        }
        
    }
    
    
    
}

另一个自定义单元格(我希望数据传递到):

import UIKit


class AlbumCell: UITableViewCell, AlbumsPickerCellDelegate {
    func didSelectedAlbum(_ selectedAlbum: String) {
        DispatchQueue.main.async {
            self.chosenAlbumLabel.text = selectedAlbum
        }
    }
    
    
    

    
    @IBOutlet var albumTitleLabel: UILabel!
    @IBOutlet var chosenAlbumLabel: UILabel!
    
    var albumsPickerTableViewCell = AlbumsPickerTableViewCell()
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        albumsPickerTableViewCell.albumsPickerCellDelegate = self
    }

    
    func configureCell(choosenAlbum: String) {
//        albumTitleLabel.text = text
        chosenAlbumLabel.text = choosenAlbum
    }
    
    
    
    
}

它不起作用,因为在 AlbumCell 中您创建了 AlbumsPickerTableViewCell 的另一个实例并将其用于委托。

一般来说,实现从一个单元格到另一个单元格的委托感觉不对。当您需要控制器中第一个单元格的值但无法获取它时,您很快就会发现自己处于这种情况。此外,如果这些单元格将被 table 视图重复使用,则会出现奇怪的行为。

在您的情况下,值得制作 UIViewController,其中包含 UITableView AlbumsPickerTableViewCell 的委托,当它从单元格调用时,将数据传递到 AlbumCell .

此外,不要忘记对委托的引用应该是 weak 以防止强引用循环。