【问题标题】:How to update a UINavigationItem based on UITableViewCell taps?如何根据 UITableViewCell 点击更新 UINavigationItem?
【发布时间】: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 方法中,但分数标签也不会在那里更新。

【问题讨论】:

    标签: ios swift uitableview uinavigationitem


    【解决方案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 循环...我应该寻找其他方式来表示用户通过测验时的分数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多