2016-09-29 63 views
0

我正在构建一个显示来自多个API的统计信息的移动应用程序。 该应用程序根据活动的API显示不同的值。在运行时,用户可以选择要显示其值的API。但是,这些值始终显示在同一个目标视图控制器中。将Seques与UINavigationController结合

UINavigationController正在使用,我想推迟导航和导航UI,如果可能的话,即使UITableViewControllers支持导航栏。

请在问题结尾处查看故事板设计图片。

环境:的iOS 9 /夫特2.2/7的XCode

  1. 在运行时,用户将选择从选择控制器选择视图控制器。 通过“完成”UIBarButton从选择视图控制器中的一个继续到目标控制器的适当方式是什么?目标控制器不会更改。

  2. 我是否必须以编程方式为嵌入UINavigationController中的每个控制器定义正确的bar按钮以“完成”?

    class UIViewController: UITableViewController { 
        override func viewWillAppear(animated: Bool) { 
          super.viewWillAppear(animated) 
          self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: nil) 
        } 
    } 
    

Storyboard Layout

回答

1

的正确方法返回到根视图控制器是:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(MyViewController.done))  
    } 


    func done() { 
     if let navigationController = self.navigationController { 
      navigationController.popToRootViewController(animated: true) 
     } 
    } 
} 

您确实需要以编程方式添加一个 “完成” 按钮;但它比这更简单。只要选择你的根视图控制器,并复制/在故事板中的课程。使用您的segues将正确的视图推送到UINavigation堆栈。

+0

其实想要从Choice控制器转到目标控制器。是最好的选择:self.navigationController.pushViewController(targetViewController)。这具有以编程方式定义视图控制器转换的缺点。 – Alex

+1

如果要将其保留为导航堆栈的一部分,可以将其推入堆栈。否则,这只是一个使用segue的问题,并且您有几个实现segse的选项,如果您愿意,也可以不使用代码。另外,在我看来,以编程方式进行并不是一个“缺点”。这是做同样事情的另一种方式。 – NonCreature0714