gpt4 book ai didi

ios - 如何在用作显示输入元素的小表格的 uitableview 中滚动时存储输入的数据?

转载 作者:行者123 更新时间:2023-11-28 15:06:14 24 4
gpt4 key购买 nike

我知道在 uitableview 中重用单元格。我有一个 uitableview,其中包含几个单元格(少于 10 个),每个单元格上都有一些输入元素(通常是文本框)。我想将此 uitableview 仅用于显示输入元素。但我知道滚动发生时单元格数据不存在。所以我想要一个好的和快速的方法来保存单元格数据。也许使用数组来保存数据,或者如果可能的话防止单元格被删除或其他解决方案。

更新

class MyViewController: UIViewController, MyCustomCellDelegator 
{

fileprivate var cell:myTableViewCell!

@IBOutlet weak var mytbl: UITableView!

override func viewDidLayoutSubviews() {
mytbl.rowHeight = UITableViewAutomaticDimension
mytbl.estimatedRowHeight = 44
}

func numberOfSectionsInTableView(_ tableView: UITableView) -> Int {
// I created one section for each person. Each section has textboxes like name,family,etc.
if (searchInputParam != nil) {
return (searchInputParam!.Type1Count!.intValue + searchInputParam!.Type2Count!.intValue + searchInputParam!.Type3Count!.intValue)
}
else{
return 0
}
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}

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

if cell == nil {
cell = tableView.dequeueReusableCell(withIdentifier: "myTableViewCell") as! myTableViewCell
}
cell.delegate = self
if ((indexPath as NSIndexPath).section + 1 <= searchInputParam!.Type1Count!.intValue)
{
cell.lblType.text = "Type1"
}
else if ((indexPath as NSIndexPath).section + 1 <= searchInputParam!.Type1Count!.intValue + searchInputParam!.Type2Count!.intValue)
{
cell.lblType.text = "Type2"
}else if ((indexPath as NSIndexPath).section + 1 <= searchInputParam!.Type1Count!.intValue + searchInputParam!.Type2Count!.intValue + searchInputParam!.Type3Count!.intValue)
{
cell.lblType.text = "Type3"
}
return cell
}
}

最佳答案

如果单元格数量相对较少(如您的情况 n < 10 ),请不要使用重用和出队。重用的全部意义在于防止创建(和保留)大量单元格。此外,如果您的大部分细胞不是同一类型(在我看来您也是这种情况),那么与不重复使用细胞相比,重复使用的效果可能会更差。

因此在您的特定情况下( n < 10 ,不同的单元格类型)- 只需在代码中直接创建单元格作为 TableView Controller 的属性,例如:

import UIKit

class Table: UITableViewController {

fileprivate let nameInputCell = NameInputCell()
fileprivate let surnameInputCell = SurnameInputCell()
fileprivate let phoneInputCell = PhoneInputCell()
// ...

...

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
return nameInputCell
case 1:
return surnameInputCell
case 2:
return phoneInputCell

...
}
}
}

单元格将在滚动时保持其状态,所以对您来说没问题。

Storyboard原型(prototype)单元更新

由于您使用 Storyboard,因此您将不得不使用不同的方法来创建单元格的实例(其余的都是相同的):

import UIKit

class Table: UITableViewController {
// use an optional
fileprivate var nameInputCell: NameInputCell!
fileprivate var surnameInputCell: SurnameInputCell!
fileprivate var phoneInputCell: PhoneInputCell!
// etc.

...

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.row {
case 0:
if nameInputCell == nil {
// if not initialized yet, load the prototype from storyboard
nameInputCell = tableView.dequeueReusableCell(withIdentifier: "your identifier here") as! NameInputCell
}
return nameInputCell
case 1:
if surnameInputCell == nil {
// if not initialized yet, load the prototype from storyboard
surnameInputCell = tableView.dequeueReusableCell(withIdentifier: "your identifier here") as! SurnameInputCell
}
return surnameInputCell
// etc.

...
}
}
}

编辑

仅供引用,如果您有一个包含重复单元格类型的大表格,重用将变得非常有用。在那种情况下,您将不得不做与所有其他 tableViews 相同的事情——创建一个数据模型,用于保存输入数据——例如如果是 textFields 字符串字典:

fileprivate let dataModel: [IndexPath: String] = [:]

然后在 cellForRowAt 中提供单元格时,您将使用数据配置它:

if let input = dataModel[indexPath] {
cell.textField.text = input
} else {
cell.textField.text = ""
}

您必须做的最后一件事是设置从单元格到 tableViewController 的委托(delegate)模式,以将更改后的数据从单元格传递到模型:

protocol TextViewCellDelegate: class {
func updateText(_ textViewCell: TextViewCell, newText: String)
}

class TextViewCell: UITableViewCell, UITextFieldDelegate {
weak var delegate: TextViewCellDelegate?

...

func textFieldDidEndEditing(_ textField: UITextField) {
delegate?.updateText(self, newText: textField.text ?? "")
}
}

在 tableViewController 中,您将设置 self作为每个单元格的代表,并在 updateText 中您只需将数据设置回模型即可。

关于ios - 如何在用作显示输入元素的小表格的 uitableview 中滚动时存储输入的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48437828/

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