我在UIVIEwController中有UItableVIEw自定义单元格(标识符= Cell).在自定义tableVIEw单元格中有两个按钮(递增/递减计数)和一个标签(显示计数).
目标:
按下增加计数或减少计数按钮时更新标签.
目前我能够获得按钮Tag并调用CellForRowAtIndexPath之外的函数.按下按钮可增加和减少计数.但我无法在标签中显示计数更新.
func tableVIEw(tableVIEw: UItableVIEw,cellForRowAtIndexPath indexPath: NSIndexPath) -> UItableVIEwCell { let cell:FoodTypetableVIEwCell = self.tableVIEw!.dequeueReusableCellWithIDentifIEr("Cell",forIndexPath: indexPath) as! FoodTypetableVIEwCell cell.addBtn.tag = indexPath.row // button 1 cell.addBtn.addTarget(self,action: "addBtn:",forControlEvents: .touchUpInsIDe) cell.subBtn.tag = indexPath.row // button 2 cell.subBtn.addTarget(self,action: "subBtn:",forControlEvents: .touchUpInsIDe) cell.countLabel.text = // How can I update this label return cell}func addBtn(sender: AnyObject) -> Int { let button: UIbutton = sender as! UIbutton count = 1 + count println(count) return count}func subBtn(sender: AnyObject) -> Int { let button: UIbutton = sender as! UIbutton if count == 0 { println("Count zero") } else { count = count - 1 } println(count) return count}
我在这里和那里看到过这个问题,但是在Swift中找不到明确的答案.如果您能帮助清楚地回答它,以便其他人不能复制,但清楚地了解正在发生的事情,我将非常感激.
谢谢.
解决方法 这是一个不需要标签的解决方案.我不会完全按照您的意愿重新创建单元格,但这涵盖了您要问的部分.使用Swift 2,因为我没有Xcode 6.x了.
让我们从UItableVIEwCell子类开始.这只是一个标签的哑容器,上面有两个按钮.单元格实际上不执行任何特定的按钮 *** 作,它只是将调用传递给配置方法中提供的闭包.这是MVC的一部分.视图不与模型交互,只与控制器交互.控制器提供闭包.
import UIKittypealias buttonHandler = (Cell) -> VoIDclass Cell: UItableVIEwCell { @IBOutlet private var label: UILabel! @IBOutlet private var addbutton: UIbutton! @IBOutlet private var subtractbutton: UIbutton! var incrementHandler: buttonHandler? var decrementHandler: buttonHandler? func configureWithValue(value: UInt,incrementHandler: buttonHandler?,decrementHandler: buttonHandler?) { label.text = String(value) self.incrementHandler = incrementHandler self.decrementHandler = decrementHandler } @IBAction func increment(sender: UIbutton) { incrementHandler?(self) } @IBAction func decrement(sender: UIbutton) { decrementHandler?(self) }}
现在控制器也很简单
import UIKitclass VIEwController: UItableVIEwController { var data: [UInt] = Array(count: 20,repeatedValue: 0) overrIDe func vIEwDIDLoad() { super.vIEwDIDLoad() // Do any additional setup after loading the vIEw,typically from a nib. } overrIDe func numberOfSectionsIntableVIEw(tableVIEw: UItableVIEw) -> Int { return 1 } overrIDe func tableVIEw(tableVIEw: UItableVIEw,numberOfRowsInSection section: Int) -> Int { return data.count } overrIDe func tableVIEw(tableVIEw: UItableVIEw,cellForRowAtIndexPath indexPath: NSIndexPath) -> UItableVIEwCell { let cell = tableVIEw.dequeueReusableCellWithIDentifIEr("Cell",forIndexPath: indexPath) as! Cell cell.configureWithValue(data[indexPath.row],incrementHandler: incrementHandler(),decrementHandler: decrementHandler()) return cell } private func incrementHandler() -> buttonHandler { return { [uNowned self] cell in guard let row = self.tableVIEw.indexPathForCell(cell)?.row else { return } self.data[row] = self.data[row] + UInt(1) self.reloadCellAtRow(row) } } private func decrementHandler() -> buttonHandler { return { [uNowned self] cell in guard let row = self.tableVIEw.indexPathForCell(cell)?.row where self.data[row] > 0 else { return } self.data[row] = self.data[row] - UInt(1) self.reloadCellAtRow(row) } } private func reloadCellAtRow(row: Int) { let indexPath = NSIndexPath(forRow: row,inSection: 0) tableVIEw.beginUpdates() tableVIEw.reloadRowsAtIndexPaths([indexPath],withRowAnimation: .automatic) tableVIEw.endUpdates() }}
当单元格出列时,它会使用要在标签中显示的值配置单元格,并提供处理按钮 *** 作的闭包.这些控制器与模型交互,以递增和递减显示的值.更改模型后,它会在tablevIEw中重新加载更改的单元格.
闭包方法采用单个参数,即对单元格的引用,从中可以找到单元格的行.这比使用标签更加去耦合,这对于了解tablevIEw中单元格的索引是非常脆弱的解决方案.
您可以从https://bitbucket.org/abizern/so-32931731/get/ce31699d92a5.zip下载完整的工作示例(需要Xcode7)
总结以上是内存溢出为你收集整理的iOS Swift,使用标记在tableview CellForRow之外更新UITableView自定义单元格标签全部内容,希望文章能够帮你解决iOS Swift,使用标记在tableview CellForRow之外更新UITableView自定义单元格标签所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)