在 ios 应用程序中根据不同输入切换 UIViewController 的最佳方式

Best way to switch UIViewControllers based on different input in an ios application

我想做的只是根据一些数据改变视图。为了准确地演示我正在尝试做什么,我构建了一个小示例来演示。我使用 UISegmentedControl 来模拟数据数据,然后当按下按钮时,它会根据 UISegmentedControl 的值在视图之间切换。这是故事板...

您可以看到有一个带有 UISegmentedControl 的基本视图,然后在同一视图上有一个按钮,该按钮将根据 UISegmentedControl 的状态触发视图控制器切换到三个视图控制器之一正确的。我已经包含了我的基本 UIViewController 的 class,这样你们都可以看到我是如何实现视图切换的。

import UIKit

class RootViewController: UIViewController {

    var nextViewIdentifier: String? = nil

    @IBAction func switchViewButtonPressed(sender: UIButton) {
        if (nextViewIdentifier != nil) {
            let nextView = self.storyboard?.instantiateViewControllerWithIdentifier(nextViewIdentifier!) as! UIViewController
            self.showViewController(nextView, sender: self)
        }
    }


    @IBAction func valueChanged(sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            nextViewIdentifier = "View1"
        case 1:
            nextViewIdentifier = "View2"
        case 2:
            nextViewIdentifier = "View3"
        default:
            nextViewIdentifier = nil
        }
    }  
}

所以,第一个函数switchViewButtonPressed在按下按钮时被调用,它会根据变量nextViewIdentifier切换视图。第二个函数 valueChanged 只是在按下 UISegmentedControl 上的按钮时更改 nextViewIdentifier 变量。


所有这些代码都有效,但它似乎不是以故事板格式实现它的自然方式。似乎应该有其他东西来达到我正在寻找的效果。我在问是否有人有更好的方法可以根据事先不知道的数据以及这些视图何时完全不同来更改视图。我认为我可以做到这一点的另一种方法是在一个视图控制器中堆叠不同的视图,然后通过 prepareForSegue 方法选择我想要的视图。无论如何,任何关于在这种情况下切换视图控制器的最佳方式的建议都是值得赞赏的。谢谢。

使用带有 "embed" segues 的容器视图。当您按下分段控件上的按钮时执行 segues。有关容器视图的更多信息:

https://www.youtube.com/watch?v=13buSJ9XeQI

您应该尝试基于 UITabBar 构建一个应用程序,它专为在视图之间切换而设计。还有 here.

选项 1: 如果视图 1/2/3 是应用程序的 不相关 部分,UITabBarController 有意义.例如,"App Store" 和 "iTunes Store" 应用程序使用标签栏。

选项 2: 如果视图 1/2/3 显示 相似 信息的子集,您可以使用单个 UITableViewController 并在选择不同的细分时重新加载 table 使用不同数据的视图。例如,"App Store" 应用有一个 Top Charts 选项卡,其中有一个 UISegmentedControl 用于显示付费、免费和最畅销应用。无需为此使用 3 个不同的视图控制器。

选项 3: 如果视图 1/2/3 显示相关 信息,但以不同的方式,您可以使用带有 UIContainerView 的父 UIViewController 来嵌入 UIViewControllers 1/2/3。例如,"iTunes Store" 应用程序有一个电影选项卡,其中有一个 UISegmentedControl 用于显示精选和排行榜。图表看起来像典型的 table 视图,而精选看起来更复杂。

我最近刚刚在我自己的应用程序中使用另一个开发人员的优秀示例代码实现了选项 3:https://github.com/mluton/EmbeddedSwapping。我很惊讶它是多么容易,而且效果如何。

万一有人关心,我解决这个问题的方法是从主视图控制器本身创建转场并用标识符命名转场。然后,根据 UISegmentedControl 的位置,我使用方法 self.performSegueWithIdentifier(<String Identifier>, sender: self).

调用了带有标识符的 segue