使用 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
以防止强引用循环。
好的,我有一个 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
以防止强引用循环。