从另一个类

问题描述:

访问UISegmentedControl @IBOoutlet我有表视图控制器,旨在作为一个设置页,包含有3段一个UISegmentedControl:从另一个类

class SettingsView: UITableViewController { 

@IBOutlet weak var ButtonSelection: UISegmentedControl! 

//Index 0 is default selection (first) 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // some code 
} 

另外,我有一个控制3导航视图控制器不同的UIViewControllers与相应的Storyboard ID(“第一”,“第二”和“第三”)。

我想准备导航视图控制器来显示基于UISegmentedControl选择适当的视图控制器。但是,我不断收到“致命错误:意外地发现零,同时解开一个可选值”,并不知道如何解决。

这是我曾尝试:

class NavViewController: UINavigationController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if SettingsView().ButtonSelection.selectedSegmentIndex == 0 { 

     print ("first segment is selected") 

     let destinationController = storyboard?.instantiateViewController(withIdentifier: "first") 

    else if SettingsView().ButtonSelection.selectedSegmentIndex == 1 { 

     print ("second segment is selected") 

     let destinationController = storyboard?.instantiateViewController(withIdentifier: "second") 

    else if SettingsView().ButtonSelection.selectedSegmentIndex == 0 { 

     print ("third segment is selected") 

     let destinationController = storyboard?.instantiateViewController(withIdentifier: "third") 

任何人都可以点我在正确的方向吗?提前致谢!

你有几个问题。

问题1:UITableViewController未设置为主机任何东西但是表视图。它的内容视图被锁定为表格视图。如果您想要一个由UITableViewController管理的表视图,并且您需要视图控制器中的其他内容,则需要使UITableViewController成为另一个视图控制器的子视图。好消息是,使用容器视图和嵌入segue可以轻松实现。

问题2是“不这样做”的问题。您应该将视图控制器的视图视为私有视图。另一个视图控制器不应该尝试查看或更改另一个视图控制器的分段控件。 (这是不好的设计,它也可能导致像你描述的崩溃,因为你不能确定是否已经加载了其他视图控制器的视图。)相反,你应该添加一个整数属性“selectedIndex”到视图包含分段控制的控制器,并使用它来读取/写入选定的段。 (按照OOP的术语,您向视图控制器的“合同”添加一个公开接口,公开您想要公开的功能,然后添加提供该接口的代码。)