Swift iOS - 如何使用 NavigationController 弹出到不同的 SegmentControl 索引

Posted

技术标签:

【中文标题】Swift iOS - 如何使用 NavigationController 弹出到不同的 SegmentControl 索引【英文标题】:Swift iOS -How to pop to different SegmentControl Index using a NavigationController 【发布时间】:2017-03-01 04:58:19 【问题描述】:
                                                //Index=0     //contains buttonToSwitchTab to pop to TabOneVC
                           TabZeroNavCntrlr ----TabZeroVC --- TabChangeVC
          //segmntCntrl   /
NavCntlr--ContainerView---
                          \                     //Index=1
                           TabOneNavCntrlr ---- TabOneVC

我有一个NavControllerContainerView 连接。在 containerView 里面有一个segmentControl。 containerView 有另外 2 个导航控制器连接到它,每个导航控制器都指向它们自己的子控制器:TabZeroVCTabOneVC。最初显示的第一个视图是TabZeroVC (selectedSegmentIndex = 0)。里面有一个按钮通向TabChangeVC,里面有一个buttonToSwitchTab。按下那个按钮我想popTabOneVC

我通过使用我的 导航控制器 尝试以下代码进行切换,但在 tabOneVC.segmentedControl.selectedSegmentIndex = 1 行上我遇到了崩溃:在展开可选值时意外发现 nil

我在上面设置了一个断点,containerVC 被初始化,但它的 3 个属性 segmentedControltabZeroVCtabOneVC 都显示为 nil。由于segmentedControlnil,这就是崩溃发生的地方。

class TabChangeVC: UIViewController

@IBAction func buttonToSwitchTab(sender: UIButton)

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let containerVC = mainStoryboard.instantiateViewControllerWithIdentifier("ContainerViewController") as! ContainerViewController
    containerVC.segmentedControl.selectedSegmentIndex = 1 //crash happens here
    self.navigationController?.popToViewController(containerVC, animated: true)
  

容器视图:

class ContainerViewController:  UIViewController
     @IBOutlet weak var segmentedControl: UISegmentedControl!
     @IBOutlet weak var tabZeroVC: UIView!
     @IBOutlet weak var tabOneVC: UIView!

...

TabOneVCselectedSegmentIndex = 1

我的问题是如何从TabChangeVC 弹出到TabOneVC,更重要的是为什么containerVC 的segmentedControl 出现为零?

【问题讨论】:

根据我的说法,您首先需要弹出NavCntrl0 中的所有元素,然后推送到navCntrl1 【参考方案1】:
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil
let tabOneVC = mainStoryboard.instantiateViewControllerWithIdentifier("TabOneNavigationController") //TabOneNavCntrlr identifire      
tabOneVC.segmentedControl.selectedSegmentIndex = 1 
appDelegate.window!.rootViewController = tabOneVC

【讨论】:

感谢家人的帮助,但没有奏效。我在这里得到相同的崩溃结果:tabOneVC.segmentedControl.selectedSegmentIndex = 1 它出现为零。我在上面设置了一个断点,TabZeroVC 和 TabOneVC 都出现为零。顺便说一句,您需要将“as!TabOneController”放在末尾: let tabOneVC = mainStoryboard.instantiateViewControllerWithIdentifier("TabOneNavigationController") as! TabOneController 或者它不会让我访问下一行的 .segmentedControl【参考方案2】:

我不知道为什么 segmentedControl 会以 nil 出现,但我可以使用 NSNotificationCenterpop 转换为 tabOneVC。我创建了一个名为 tabSwitch() 的函数,其中包含我想要显示的段,然后我在 viewDidLoadContainerViewController 中添加了一个 listener

class ContainerViewController:  UIViewController
     @IBOutlet weak var segmentedControl: UISegmentedControl!
     @IBOutlet weak var tabZeroVC: UIView!
     @IBOutlet weak var tabOneVC: UIView!

override func viewDidLoad() 
     super.viewDidLoad()

     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(tabSwitch), name: "tabSwitch", object: nil)
  

func tabSwitch()

     self.segmentedControl.selectedSegmentIndex = 1
     self.tabZeroVC.hidden = true
     self.tabOneVC.hidden = false
  

在 TabChangeVC 中,我添加了一个 notifier 来触发它,并添加了 navigationController?.popToRootViewControllerAnimated(true) 以返回到 root vc:

class TabChangeVC: UIViewController

@IBAction func buttonToSwitchTab(sender: UIButton)

     NSNotificationCenter.defaultCenter().postNotificationName("tabSwitch", object: nil)
     self.navigationController?.popToRootViewControllerAnimated(true)
  

【讨论】:

以上是关于Swift iOS - 如何使用 NavigationController 弹出到不同的 SegmentControl 索引的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何使用 Swift 在视图之间滑动

如何使用 Swift、iOS 7 设置 rootViewController

如何在 ios 上的 react-native-navigation(V1) 中添加后退按钮以关闭模式屏幕

如何使用 coreLocation (iOS/Swift) 读取完整地址

iOS - 如何在 swift 中使用`NSMutableString`

如何使用swift从ios应用程序调用苹果钱包