gpt4 book ai didi

ios - 如何同时更新每个自定义tableview单元格数据?

转载 作者:IT王子 更新时间:2023-10-29 05:21:25 24 4
gpt4 key购买 nike

我正在使用带有 Swift 3 的 Xcode 8.2.1。我有一个包含 UITextView 的自定义 UITableViewCell。当我输入 textView 时,自定义单元格会自动增长。这部分工作正常。当我输入特定单元格时,我还想用相同的数据更新我的其他单元格。例如:

当我在第 5 个单元格中键入文本时,会自动在第 11、15 和 18 单元格中输入相同的数据。这些细胞也必须自动生长。我已将数据添加到数组的特定索引中。但它不会反射(reflect)在 tableView 中。如何实现此功能?

请检查我目前已实现的以下代码。此 updateCellHeight 方法是自定义委托(delegate)方法。当用户在 textView 中键入时调用此方法。

func updateCellHeight(indexPath: IndexPath, comment: String) {

let currentCellLyricVal = self.traduzioneArray[indexPath.row]["rics"]
tempIndexArray.removeAll()

for (index,element) in traduzioneArray.enumerated() {

let lyricVal = element["rics"]
if currentCellLyricVal == lyricVal {
tempIndexArray.append(index)
}
}
for index in tempIndexArray {
self.traduzioneArray[index]["ione"] = comment
self.lyricsTableView.beginUpdates()
self.lyricsTableView.endUpdates()
}
}

func textViewDidChange(_ textView: UITextView) {
self.delegate.updateCellHeight(indexPath: self.cellIndexPath, comment: textView.text)
}

最佳答案

我认为自动数据输入的问题在于重新加载单元格会导致 resignFirstResponder() 调用。

这看起来很合乎逻辑,因为在重新加载数据时,您实际上放弃了一些单元格,并通过 cellForRowAt: 向 TableView 请求新单元格。旧的可能不一样,所以它们 resignFirstResponder()

更新单元格文本的一种方法是直接更改单元格内容。您可以对 TextView 内容执行此操作。不幸的是,对于单元格高度,无法在不触发 heightForRowAt: 的情况下直接更改单元格。

更新 2:有一个适用于 iOS 8+ 的解决方案,结合了表格 View 上的直接单元格操作和 AutomaticDimension。
完美地为 UITextView 工作。检查下面的更新。这是最终结果的样子:

enter image description here

UPDATE1:添加了直接单元格操作的代码示例

使用简单的模型来保存 TableView 数据:

// Simple model, for the example only
class Model {
// The value of the text field
var value: String?
// The type of the cell
var type: CustomCell.CellType = .typeA

init(value: String) {
self.value = value
}

init(value: String, type: CustomCell.CellType) {
self.value = value
self.type = type
}
}

// Init the model.
var tableData = [
Model(value: "Cell Type A", type: .typeA),
Model(value: "Cell Type B", type: .typeB),
Model(value: "Cell Type B", type: .typeB),
Model(value: "Cell Type A", type: .typeA),
Model(value: "Cell Type B", type: .typeB)]

像这样委托(delegate):

// Delegate to update visible cells in the table view when text field value change.
protocol TextChangeDelegate {
func textChangedAtCell(_ cell: CustomCell, text: String?)
}

然后初始化您的自定义单元格:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

// Will crash if identifier is not registered in IB
let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomCell

// For this to work you need to update the model on each text field text change
cell.textValue.text = tableData[indexPath.row].value
cell.index = indexPath.row
cell.type = tableData[indexPath.row].type
cell.textChangeDelegate = self

return cell
}

在自定义单元格中:

class CustomCell: UITableViewCell {

// The type of the cell. Cells with same type will be updated simultaneously.
enum CellType {
case typeA
case typeB
}

// Very simple prototype cell with only one text field in it
@IBOutlet weak var textValue: UITextField!

// Default type
var type = CellType.typeA
// Index in the model. Not optional (or other special assumptions on initial value)
// for simplicity of the example.
var index = 0
var textChangeDelegate: TextChangeDelegate?
}

extension CustomCell: UITextFieldDelegate {

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

// Assume we will return true. Any logic could appear here.
// If we need to return false, don't call the delegate method.
let result = true

if result {
let nsString = textField.text as NSString?
let newString = nsString?.replacingCharacters(in: range, with: string)
print("New: \(newString ?? "(nil)")")

textChangeDelegate?.textChangedAtCell(self, text: newString)
}

return result
}
}

这是如何在具有直接单元格访问的 View Controller 中实现 TextChangeDelegate,即无需重新加载数据:

extension ViewController: TextChangeDelegate {

func textChangedAtCell(_ cell: CustomCell, text: String?) {

// Only visual update. Skip the cell we are currently editing.
for visibleCell in tableView.visibleCells where visibleCell != cell {
if let currentCell = visibleCell as? CustomCell,
tableData[currentCell.index].type == cell.type {
currentCell.textValue.text = text
}
}

// Update the model (including invisible cells too)
for (index, data) in tableData.enumerated() where data.type == cell.type {
tableData[index].value = text
}

// Avoid reloading here, as this will trigger resignFirstResponder and you will
// have issues when jumping from text field to text field across cells.
}
}

您现在可以在具有相同 CellType 的所有单元格上同时进行文本更新。此示例使用 UITextField(检查 UITextView 的 UPDATE2)。

UPDATE2 放在这里。带有同时文本和高度调整的 UITextView 的单元格。

使用上一个示例中的模型和 Controller (因为您将使用新的单元格,因此进行了微小的更改)。利用 UITableViewCell 并将 UITextView 放入其中。在 AutoLayout 中为 TextView 设置约束:

Add constraints for auto resize

请记住禁用滚动和反弹到 TextView (否则您将没有自动高度)。不要忘记将 textView 的委托(delegate)链接到 UITextViewCell 子类。

然后在单元格中,使用

func textViewDidChange(_ textView: UITextView) {
self.textChangeDelegate?.textChangedAtCell(self, text: textView.text)
}

然后, super 重要,在ViewController的viewDidLoad中,添加这两个设置

tableView.estimatedRowHeight = 50
tableView.rowHeight = UITableViewAutomaticDimension

并注册单元格:

tableView.register(UINib(nibName: "CustomTextViewCell", bundle: nil),
forCellReuseIdentifier: "customTextViewCell")

最后,将此代码添加到 UPDATE1 的 TextChangeDelegate 实现中,以执行实际的高度更新技巧:

func textChangedAtCell(_ cell: UITableViewCell, text: String?) {

<code from UPDATE 1 goes here>

tableView.beginUpdates()
tableView.endUpdates()
}

尽情享受吧!

关于ios - 如何同时更新每个自定义tableview单元格数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44494744/

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