iOS Swift,使用标记在tableview CellForRow之外更新UITableView自定义单元格标签

iOS Swift,使用标记在tableview CellForRow之外更新UITableView自定义单元格标签,第1张

概述安装程序( Swift 1.2 / iOS 8.4): 我在UIViewController中有UITableView自定义单元格(标识符= Cell).在自定义TableView单元格中有两个按钮(递增/递减计数)和一个标签(显示计数). 目标: 按下增加计数或减少计数按钮时更新标签. 目前我能够获得按钮Tag并调用CellForRowAtIndexPath之外的函数.按下按钮可增加和减少计数. 安装程序( Swift 1.2 / iOS 8.4):

我在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自定义单元格标签所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1004445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存