如何从主视图控制器访问自定义UITableViewCell



我有一个带有UITableView的主视图控制器。表视图有 2 个在 IB 中原型化的单元格。

原型细胞

第一个单元格位于第 0 部分,第二个单元格位于第 1 部分(始终位于表格底部(。

这是我在主视图控制器中的表定义:

func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return itemNames.count
} else {
return 1
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Created additional section where will be the cell for adding items (always at bottom)
switch indexPath.section {
case 0:
let cellIdentifier = "itemCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ItemTableViewCell
cell.itemNameTextView.text = itemNames[indexPath.row]
let currentImage = itemImages[indexPath.row]
cell.itemStateButton.setImage(UIImage(named: currentImage), for: UIControlState.normal)
return cell
case 1:
let cellIdentifier = "addItemCell"
let addCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ItemTableViewCell
addCell.addItemButton.setImage(UIImage(named: "plus-math-40"), for: UIControlState.normal)
return addCell
default:
return UITableViewCell()
}
}

单元格的所有出口都在自定义 UITableViewCell 中定义:

class ItemTableViewCell: UITableViewCell {
@IBOutlet var itemNameTextView: UITextView!
@IBOutlet var itemStateButton: UIButton!
@IBOutlet var addItemButton: UIButton!
@IBOutlet var addTextView: UITextView!

如何从主视图控制器访问 ItemTableViewCell 中插座变量的值(读取和更改(?

例如,当在第二个单元格中按下"+"按钮时,我需要将TextView变成第一响应者,然后保存TextFiled的值。

我还需要编辑 0 部分单元格上的文本字段,然后保存其中的数据。

我已经使用定义为自定义单元格实例的当前单元格制作了它(这是在完成单元格中的文本视图编辑后将数据保存到 CoreData 的代码(:

func textViewDidEndEditing(_ textView: UITextView) {
currentTextView = nil
// Finished edit tex tin text view. Save new values to CoreData
let currentCell = tableView.cellForRow(at: currentIndexPath) as! ItemTableViewCell
if let appDelegate = (UIApplication.shared.delegate as? AppDelegate) {
// Add Mode. Adding values from addItemCell to CoreData
if editMode == false {
// In add mode we need to add a new record to CoreData
// Check if textview is not empty
if currentCell.addTextView.text != "" {
shoppingItem = ItemMO(context: appDelegate.persistentContainer.viewContext)
shoppingItem.itemName = currentCell.addTextView.text
shoppingItem.itemCreatedDate = Date()
shoppingItem.itemDone = false
currentCell.addTextView.text = ""
}
} else {
// In edit mode we need to save current values and save context
if currentCell.itemNameTextView.text != "" {
shoppingItems[currentIndexPath.row].itemName = currentCell.itemNameTextView.text
}
}
appDelegate.saveContext()
tableView.reloadData()
}
}

我在开始编辑单元格时采用的当前索引路径值:

func textViewDidBeginEditing(_ textView: UITextView) {
currentTextView = textView
var superview = textView.superview
while let view = superview, !(view is UITableViewCell) {
superview = view.superview
}
guard let cell = superview as? UITableViewCell else {
//print("button is not contained in a table view cell")
return
}
guard let indexPath = tableView.indexPath(for: cell) else {
//print("failed to get index path for cell containing button")
return
}
// Setup current index path value
self.currentIndexPath = indexPath
// Setup edit mode for data saving in textViewDidEndEditing
if currentIndexPath.section == 0 {
editMode = true
} else {
if currentIndexPath.section == 1 {
editMode = false
}
}
}

如果您只有 2 个部分和每个部分中的一行,那么您可以赋予 addItemButton 标签值等于部分编号。然后向该按钮添加操作并定义相应的选择器。在该选择器方法中,从发件人的标记中获取节值,并获取对应于节和行(=0(的索引路径。从该索引路径中,获取单元格,然后您可以访问主控制器中单元格的任何出口。

谢谢

你想

  1. 获取自定义UITableViewCell上的按钮按下事件
  2. 从主UIViewController更改IBOutlet值

首先,要在单元格对象上获取按钮按下事件,您有 2 个选项:

1.1 实例化单元格时附加目标:

// In your tableView cellForRow method
addCell.addItemButton.addTarget(self, action: #selector(bringUpTextfieldMethod), for: .touchUpInside)

1.2 使用委托结构:让ItemTableViewCell声明委托协议,通过IBAction出口捕获此类中的按钮按下事件,并使用委托传递事件。主视图控制器符合协议并实现委托回调。

其次 - 访问单元格的 IBOutlet。在需要访问单元格的任何地方:

let indexPath = IndexPath.init(row: 0, section: 0) // Obviously with the correct row/sec
let itemCell = tableView.cellForRowAtIndexPath(indexPath) as! ItemTableViewCell  // your tableview must be an IBOutlet on your view controller
// Now you can access properties on itemCell
// e.g:
let name = itemCell.itemNameTextView.text 

最新更新