【问题标题】:prepare for segue issue with multiple ViewControllers Not 100% working准备多个 ViewController 的 segue 问题不是 100% 工作
【发布时间】:2016-12-21 16:28:46
【问题描述】:

有 4 个视图控制器: 竞赛视图控制器 种族信息视图控制器 能力计算器视图控制器 能力最终视图控制器

快速概览应用程序的工作原理。首先,用户从abilityCalcViewController 开始,他们更新他们的统计数据,然后在完成后点击选择比赛按钮,然后转到raceViewController。这里有 2 个按钮 1 通向raceInfoViewController,另一个通向abilityFinalViewController。每个不同的视图控制器都有自己的一组信息在 ViewController 之间传递。

我的代码是:

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "abilityFinalViewController"
        {
            let destFinalViewController: abilityFinalViewController = segue.destination as! abilityFinalViewController

            destFinalViewController.strStatScore = strStatScore
        }
        else if segue.identifier == "raceInfoViewController"
        {
            let destViewController: raceInfoViewController = segue.destination as! raceInfoViewController
            // Dwarf
            if raceTable.indexPathForSelectedRow == [0,0]
            {
                print(raceTable.indexPathForSelectedRow ?? 0)
                destViewController.raceName = races[0]
                destViewController.raceStat = stats[0]
            }

            // Elf
            else if raceTable.indexPathForSelectedRow == [0,1]
            {
                destViewController.raceName = races[1]
                destViewController.raceStat = stats[1]
            }

            // Gnome
            else if raceTable.indexPathForSelectedRow == [0,2]
            {
                destViewController.raceName = races[2]
                destViewController.raceStat = stats[2]
            }

            // Half Elf
            else if raceTable.indexPathForSelectedRow == [0,3]
            {
                destViewController.raceName = races[3]
                destViewController.raceStat = stats[3]
            }

            // Half-Orc
            else if raceTable.indexPathForSelectedRow == [0,4]
            {
                destViewController.raceName = races[4]
                destViewController.raceStat = stats[4]
            }

            // Halfling
            else if raceTable.indexPathForSelectedRow == [0,5]
            {
                destViewController.raceName = races[5]
                destViewController.raceStat = stats[5]
            }

            // Human
            else if raceTable.indexPathForSelectedRow == [0,6]
            {
                destViewController.raceName = races[6]
                destViewController.raceStat = stats[6]
            }

            // Ifrit
            else if raceTable.indexPathForSelectedRow == [0,7]
            {
                destViewController.raceName = races[7]
                destViewController.raceStat = stats[7]
            }

            // Oread
            else if raceTable.indexPathForSelectedRow == [0,8]
            {
                destViewController.raceName = races[8]
                destViewController.raceStat = stats[8]
            }

            // Sylph
            else if raceTable.indexPathForSelectedRow == [0,9]
            {
                destViewController.raceName = races[9]
                destViewController.raceStat = stats[9]
            }

            // Tengu
            else if raceTable.indexPathForSelectedRow == [0,10]
            {
                destViewController.raceName = races[10]
                destViewController.raceStat = stats[10]
            }

            // Undine
            else if raceTable.indexPathForSelectedRow == [0,11]
            {
                destViewController.raceName = races[11]
                destViewController.raceStat = stats[11]
            }
        }
    }

我的问题是,当我单击导致abilityFinalViewController 的按钮或转到raceInfoViewController 的按钮时,它会转换,但没有传递任何数据。所以destFinalViewController.strStatScore = strStatScore 在到达下一个目的地时似乎是空白的。我错过了什么?

【问题讨论】:

  • 我怀疑它不会出现在您的任何if raceTable.indexPathForSelectedRow 案例中。打破并检查raceTable.indexPathForSelectedRow
  • 我厌倦了只做一个简单的打印,看看控制台说什么。什么都没有打印。你指的是这个吗?
  • edit 用您的打印语句及其输出回答。
  • 您确定标识符是正确的并且与故事板中的 id 名称匹配吗?
  • shallowThought 更新了 Gabriel 我不确定在哪里实际检查...我正在自学所有这些...

标签: ios swift uiviewcontroller segue


【解决方案1】:

请注意,根据 segue 标识符决定做什么的 prepareForSegue 代码是脆弱的。如果您忘记设置标识符,或者您的标识符中有拼写错误,则不起作用。

在 Swift 中,我更喜欢使用基于目标视图控制器的类进行切换的 switch 语句:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {

    case let miniCarContainerViewController as MiniCartConatinerViewController:
        //Code to configure MiniCartConatinerViewController
        print("Destination is class MiniCartConatinerViewController")

    case let addOnsItemViewController as AddonsItemViewController:
        //Code to configure AddonsItemViewController
        print("Destination is class MiniCartConatinerViewController")

    default:
        print("Destination is unknown class!")
        break
    }
}

case let 语法具有双重作用,因为它可以根据目标视图控制器的类将局部变量强制转换为正确的类型。

顺便说一句,在 Swift 中,类名和类型名应该总是以大写字母开头。变量名应以小写字母开头。因此,您的abilityFinalViewController 类应命名为AbilityFinalViewControllerraceInfoViewController 应命名为RaceInfoViewController

【讨论】:

  • 天哪,效果很好。感谢您的帮助和命名帮助。我不知道。我正在快速自学。我会去更新所有这些。
猜你喜欢
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多