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
我有一个NavController
与ContainerView
连接。在 containerView 里面有一个segmentControl
。 containerView 有另外 2 个导航控制器连接到它,每个导航控制器都指向它们自己的子控制器:TabZeroVC
和 TabOneVC
。最初显示的第一个视图是TabZeroVC
(selectedSegmentIndex = 0)。里面有一个按钮通向TabChangeVC
,里面有一个buttonToSwitchTab
。按下那个按钮我想pop
到TabOneVC
。
我通过使用我的 导航控制器 尝试以下代码进行切换,但在 tabOneVC.segmentedControl.selectedSegmentIndex = 1
行上我遇到了崩溃:在展开可选值时意外发现 nil
我在上面设置了一个断点,containerVC 被初始化,但它的 3 个属性 segmentedControl
、tabZeroVC
和 tabOneVC
都显示为 nil。由于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 出现为零?
【问题讨论】:
根据我的说法,您首先需要弹出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 出现,但我可以使用 NSNotificationCenter
将 pop
转换为 tabOneVC
。我创建了一个名为 tabSwitch() 的函数,其中包含我想要显示的段,然后我在 viewDidLoad
的 ContainerViewController
中添加了一个 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 索引的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swift、iOS 7 设置 rootViewController
如何在 ios 上的 react-native-navigation(V1) 中添加后退按钮以关闭模式屏幕
如何使用 coreLocation (iOS/Swift) 读取完整地址