Swift iOS - 如何使用 NavigationController 弹出不同的 SegmentControl Index
Swift iOS -How to pop to different SegmentControl Index using a NavigationController
//Index=0 //contains buttonToSwitchTab to pop to TabOneVC
TabZeroNavCntrlr ----TabZeroVC --- TabChangeVC
//segmntCntrl /
NavCntlr--ContainerView---
\ //Index=1
TabOneNavCntrlr ---- TabOneVC
我有一个 NavController
,ContainerView
与之相连。在containerView里面有一个segmentControl
。 containerView 还有 2 个导航控制器与之相连,每个导航控制器都指向自己的子控制器:TabZeroVC
和 TabOneVC
。最初显示的第一个视图是 TabZeroVC
(selectedSegmentIndex = 0)。里面有一个按钮指向 TabChangeVC
,里面有一个 buttonToSwitchTab
。按下那个按钮我想 pop
到 TabOneVC
。
我通过使用我的 导航控制器 尝试了下面的代码来进行切换,但是在行 tabOneVC.segmentedControl.selectedSegmentIndex = 1
上我遇到了崩溃: unexpectedly found展开可选值时为零
我在它上面放了一个断点,containerVC 被初始化了,但是它有 3 个属性 segmentedControl
、tabZeroVC
和 tabOneVC
全部为零。由于 segmentedControl
是 nil 这就是崩溃发生的地方。
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!
...
}
TabOneVC
是 selectedSegmentIndex = 1
我的问题是如何从 TabChangeVC
弹出到 TabOneVC
更重要的是,为什么 containerVC 的 segmentedControl 出现为 nil?
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
我不知道为什么 segmentedControl 显示为 nil 但我能够 pop
tabOneVC
通过使用 NSNotificationCenter
。我用我想显示的片段创建了一个名为 tabSwitch() 的函数,然后我在 ContainerViewController
的 viewDidLoad
中添加了一个 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)
}
}
//Index=0 //contains buttonToSwitchTab to pop to TabOneVC
TabZeroNavCntrlr ----TabZeroVC --- TabChangeVC
//segmntCntrl /
NavCntlr--ContainerView---
\ //Index=1
TabOneNavCntrlr ---- TabOneVC
我有一个 NavController
,ContainerView
与之相连。在containerView里面有一个segmentControl
。 containerView 还有 2 个导航控制器与之相连,每个导航控制器都指向自己的子控制器:TabZeroVC
和 TabOneVC
。最初显示的第一个视图是 TabZeroVC
(selectedSegmentIndex = 0)。里面有一个按钮指向 TabChangeVC
,里面有一个 buttonToSwitchTab
。按下那个按钮我想 pop
到 TabOneVC
。
我通过使用我的 导航控制器 尝试了下面的代码来进行切换,但是在行 tabOneVC.segmentedControl.selectedSegmentIndex = 1
上我遇到了崩溃: unexpectedly found展开可选值时为零
我在它上面放了一个断点,containerVC 被初始化了,但是它有 3 个属性 segmentedControl
、tabZeroVC
和 tabOneVC
全部为零。由于 segmentedControl
是 nil 这就是崩溃发生的地方。
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!
...
}
TabOneVC
是 selectedSegmentIndex = 1
我的问题是如何从 TabChangeVC
弹出到 TabOneVC
更重要的是,为什么 containerVC 的 segmentedControl 出现为 nil?
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
我不知道为什么 segmentedControl 显示为 nil 但我能够 pop
tabOneVC
通过使用 NSNotificationCenter
。我用我想显示的片段创建了一个名为 tabSwitch() 的函数,然后我在 ContainerViewController
的 viewDidLoad
中添加了一个 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)
}
}