如何根据 UITableViewCell 点击更新 UINavigationItem?

Posted

技术标签:

【中文标题】如何根据 UITableViewCell 点击更新 UINavigationItem?【英文标题】:How to update a UINavigationItem based on UITableViewCell taps? 【发布时间】:2019-08-16 00:27:06 【问题描述】:

我正在创建一个测验应用程序,其中每个测验问题都是一个分组的 TableView,每个单元格都是一个答案选择,并嵌入在导航控制器中。对于用户点击的每个正确答案,我希望他们的分数增加 1。我在导航控制器中将分数标签设置为 rightBarButtonItem。

这是我在 viewDidLoad( ) 中创建条形按钮项的内容:

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Score: \(score)", style: .plain, target: nil, action: Selector(("updateScore")))

我有一个模型类 Question,其中包含一个数组 questionsList,其中包括以下属性:questionString、answers[]、selectedAnswerIndex (nil) 和 correctAnswerIndex (int)

updateScore 方法:

@objc func updateScore() 

        for question in questionsList 

            if question.selectedAnswerIndex == question.correctAnswerIndex 
                score += 1
            
        
    

有什么想法吗?我尝试通过将分数标签放在页脚视图中,使用 viewForFooterInSection 作为表格控制器,并将 for 循环放在我的 didSelectRowAt 方法中,但分数标签也不会在那里更新。

【问题讨论】:

【参考方案1】:

更新score 后,您需要创建并分配一个新的条形按钮项。您无法更新现有按钮的文本。

for 循环之后,添加:

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Score: \(score)", style: .plain, target: nil, action: Selector(("updateScore")))

是的,它与您显示的用于创建原始按钮的代码相同。

更好的方法是更新您的 score 属性:

var score: Int = 0 
    didSet 
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Score: \(score)", style: .plain, target: nil, action: Selector(("updateScore")))
    

然后更新你的updateScore:

@objc func updateScore() 
    var newScore = score
    for question in questionsList 
        if question.selectedAnswerIndex == question.correctAnswerIndex 
            newScore += 1
        
    

    score = newScore

然后更新viewDidLoad(或任何地方)并删除当前调用以创建条形按钮项并简单地执行:

score = 0 // or some other appropriate initial value

【讨论】:

感谢您的回复,但我应该将代码放在哪里来创建和分配新的条形按钮项?就在我创建第一个条形按钮项之后? 好的。我对我应该为新的条形按钮项目命名并为操作添加什么感到困惑。将它命名为 score 并将 updateScore 方法作为选择器对我来说没有多大意义,因为那已经在 viewDidLoad 中了。 谢谢。在我添加了didSet 部分后,它给了我一个“类 'QuestionTableViewController' 没有初始化程序”错误,所以我添加了init(userScore: int) 和 tableviewcontroller 所需的初始化,但现在我得到一个“无法调用初始化程序在我的 didSelectRowAt 方法中,我的let questionTableViewController = QuestionTableViewController( ) 上键入“不带参数的问题表视图控制器”错误(根据用户是否选择一行来推送下一个问题).. 只需将score初始化为0。我更新了答案。 感谢您的帮助,但分数标签似乎没有更新。我认为它不是我的包含 questionsList 数组的问题模型类,因为我之前已经让我的评分工作(不是在条形按钮项目上)具有相同的 for 循环...我应该寻找其他方式来表示用户通过测验时的分数吗?

以上是关于如何根据 UITableViewCell 点击更新 UINavigationItem?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 UITableViewCell?

如何在事件发生后更新 UITableViewCell

iOS Swift 如何更改或更新自定义 UITableViewCell 中的 UILabel 属性

UITableViewCell 框架仅在滚动后更新

如何在UITableViewCell内部更新UITableView的高度约束

何时何地根据实际宽度更新 UITableViewCell 子视图的约束