gpt4 book ai didi

ios - 如何从主 ViewController 访问自定义 UITableViewCell

转载 作者:行者123 更新时间:2023-11-30 11:26:27 25 4
gpt4 key购买 nike

我有一个带有 UITableView 的主视图 Controller 。表格 View 有 2 个在 IB 中原型(prototype)化的单元格。

Prototyped Cells

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

这是我在主 ViewController 中的表定义:

    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()
}
}

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

class ItemTableViewCell: UITableViewCell {

@IBOutlet var itemNameTextView: UITextView!
@IBOutlet var itemStateButton: UIButton!
@IBOutlet var addItemButton: UIButton!
@IBOutlet var addTextView: UITextView!

如何从主 ViewController 访问 ItemTableViewCell 中的 Outlet 变量的值(读取和更改)?

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

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

最佳答案

我已经将当前单元格定义为自定义单元格实例(这是在单元格中编辑完 TextView 后将数据保存到 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()
}

}

开始编辑单元格时我采用的 currentIndexPath 值:

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
}
}
}

关于ios - 如何从主 ViewController 访问自定义 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50693060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com