- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
SWIFT
我需要制作一个单元格数组。我有几个带有 nib 文件的自定义单元格类(继承自 UITableViewCell)。
如何在不在 tableview 中注册 nib 并执行 dequeueReusableCellWithIdentifier 的情况下初始化单元格?我是这样做的,但不要认为它会起作用:
var labelCell = CustomCellClass.initialize()
最佳答案
我从其他地方的评论中的讨论中推断,您不想让单元格出列和重用的原因是您无法跟踪单元格中捕获的用户输入。
最重要的是,您确实应该允许单元格出队和重用,并适本地处理它。如果您在重复使用单元格时遇到问题,可以通过将“模型”(即您的数据)与“ View ”(即 UIKit 控件)分开来解决。这就是精神model-view-controller pattern ,但在任何具有关注点分离的模式中都是如此(例如,MVVP、MVP 等)。
关键是,当单元格中的值发生变化时,您的单元格应立即通知 View Controller ,以便 View Controller 可以立即更新模型。然后,当 View Controller 稍后需要对与特定行关联的值执行某些操作时,它不会从单元格中检索它,而是从它自己的模型中检索。
因此,我可能会为单元格定义一个协议(protocol),以通知 TableView 其文本字段已更改:
protocol CustomCellDelegate: class {
func cell(_ cell: CustomCell, didUpdateTextField textField: UITextField)
}
然后我将定义一个调用该委托(delegate)的单元类:
class CustomCell: UITableViewCell {
weak var delegate: CustomCellDelegate?
@IBOutlet weak var customTextField: UITextField! // hook up outlet to this property in IB
@IBAction func didChangeValue(_ sender: UITextField) { // hook up "editing changed" action for the text field to this method in IB
delegate?.cell(self, didUpdateTextField: sender)
}
}
现在, View Controller 将:
cellForRowAt
中,填充文本字段并将其自身指定为该单元格的委托(delegate);和didUpdateTextField
方法以在用户更改任何内容时更新模型。因此,类似于:
class ViewController: UITableViewController {
var values = ["One", "Two", "Three"] // some initial values
private let cellIdentifier = "CustomCell"
override func viewDidLoad() {
super.viewDidLoad()
// if you’re using NIBs, you register them.
// obviously if using prototype cells in your storyboard, this isn’t necessary.
tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) // or use cell prototype with storyboard identifer specified
}
}
// MARK: - UITableViewDataSource
extension ViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return values.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! CustomCell
// populate cell and specify delegate
cell.delegate = self
cell.customTextField.text = values[indexPath.row]
return cell
}
}
// MARK: - CustomCellDelegate
extension ViewController: CustomCellDelegate {
func cell(_ cell: CustomCell, didUpdateTextField textField: UITextField) {
// when the cell tells us that its text field's value changed, update our own model
if let indexPath = tableView.indexPath(for: cell), let string = textField.text {
values[indexPath.row] = string
}
}
}
许多人可能倾向于通过将文本字段的 IBAction
直接挂接到 View Controller 方法来进一步简化它。这行得通,并且消除了对这个协议(protocol)的需要,但问题是你需要弄清楚这个特定的 UIKit 控件与哪一行相关联。常见的技巧是向上导航 View 层次结构以识别适当的单元格(例如,文本字段通常位于单元格内的内容 View 中,因此您可以将 textField.superview.superview as!UITableViewCell
抓取) ,但这对我来说有点脆弱。
但不管这个小细节如何,希望这能说明更广泛的模式。与其试图让单元格跟踪用户输入,不如让单元格(“ View ”)立即更新 Controller 的任何数据更改,然后 View Controller 立即更新模型,你不再需要担心iOS 采用的单元重用优化。
有关 Swift 2 版本,请参阅 previous revision of this answer .
关于ios - 从没有 dequeueReusableCellWithIdentifier 的 nib 初始化自定义 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38269248/
我已阅读 this question并认为我理解这两种方法之间的区别,直到我找到一个奇怪的例子: 在Storyboard中设置table view cell的样式为Basic,Identifier为C
dequeueReusableCellWithIdentifier 有两个重载,我正在尝试确定何时应该使用一个与另一个? 关于 forIndexPath 函数的苹果文档指出,“此方法使用索引路径根据单
我在我的一个 TableView 中使用仪器发现了内存泄漏,恰好在这一行: [[NSBundle mainBundle] loadNibNamed:@"ShopListCell" owner:self
我正在使用带有 UITableViewController 和 UITableViewCell 子类的 ios5 Storyboard。我不想在 View 的 Storyboard设计器中设计单元格的
我正在尝试在独立于 Storyboard 和 Nib 配置的表格 View 中使用自定义单元格。 每当我使用 tableview 的 dequeuing 方法时,这些单元格都会作为标准返回,即磨坊单元
如果我打电话: -[UITableView dequeueReusableCellWithIdentifier] 然后我选择不是 在此方法中重用单元格 - (UITableViewCell *)tab
我的目标是显示一个单元格列表,这些单元格由我从服务器上提取的一些数据填充。当用户向下滚动时,我希望有一个表格单元格,上面写着“正在加载更多”,然后随着更多单元格被数据填充而消失。 以下是执行此操作的相
好的,我有一个表格,其中包含 3 个不同的原型(prototype)单元格(cellVaccination、cellAdmin、cellExpire)。在我的 cellForRowAtIndexPat
我有一个 UITableView,一旦它滚出屏幕,它就不会释放它显示的数据。 每个表格单元格都需要显示名称、日期和图片。第一个充满屏幕的单元格在启动时可以正常工作,因为它们没有被重复使用。然而,一旦您
我在带有自定义单元格的 UIViewController 中使用 UITableView。但是,当 dequeueReusableCellWithIdentifier 被调用时,它有时会创建一个新单元
我试图了解出了什么问题,因为当我进行 TableView 更新并调用 cellForRowAtIndexPath 时, dequeueReusableCellWithIdentifier 无法取回我需
我有一个使用 NSLayoutConstraints 的自定义/子类 UITableViewCell。最左边的 UIImageView 可能填充也可能不填充图像,如果没有,则此字段右侧的对象自然会向左
我有一个最初加载一个自定义单元格的 tableView。该单元格有一个文本字段和一个用户可以修改的段控件。还有一个添加单元格按钮,如果按下该按钮,则会在前一个单元格下方添加另一个自定义单元格。用户最多
我有一个核心数据支持的 TableView ,它显示了一个可编辑字段列表,对于不同的字段类型,我有不同的 UTableViewCells 和不同的单元格标识符。当我在模拟器中滚动得太快或试图“弹”过最
我使用几乎每个人都用来处理 cellForRowAtIndexPath 的“著名”样板代码: UITableViewCell *cell = [tableView dequeueReusableCel
=> Demo Project @ GitHub Int { return 0 } 但随后应用程序崩溃了 -[UITableViewDataSource tableView:viewForFoo
我的 UITableView 有问题。当 UIViewController 结束加载 UITableViewCell 时,第一次加载大约需要 4 秒 6 秒。当我再次调用我的 UIViewContro
如果 dequeueReusableCellWithIdentifier 在单元格离开屏幕后重新使用它们,这是否意味着在单元格上设置的实例变量将由于其新用法而被覆盖? 例如,如果我要在实例变量中缓存单
我在想 - dequeueReusableCellWithIdentifier 仍然必须实例化一个新单元格,并且根据实例化单元格的尺寸,它必须重新计算布局。那么这种出列实际上有什么帮助呢? 最佳答案
我对 dequeueReusableCellWithIdentifier 方法的使用及其工作原理有点困惑。我目前有一个 searchBar 和两个可变数组(比如 filteredTableData 和
我是一名优秀的程序员,十分优秀!