从另一个类访问 UISegmentedControl @IBOoutlet

Posted

技术标签:

【中文标题】从另一个类访问 UISegmentedControl @IBOoutlet【英文标题】:Accessing UISegmentedControl @IBOoutlet from another class 【发布时间】:2017-06-04 23:49:22 【问题描述】:

我有表视图控制器,旨在用作设置页面,其中包含一个 UISegmentedControl 与 3 个段:

class SettingsView: UITableViewController 

@IBOutlet weak var ButtonSelection: UISegmentedControl!

//Index 0 is default selection (first)

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

另外,我有一个导航视图控制器,它控制 3 个不同的 UIViewControllers 具有相应的故事板 ID(“第一”、“第二”和“第三”)。

我正在尝试准备导航视图控制器,以根据 UISegmentedControl 选择呈现适当的视图控制器。但是,我不断收到“致命错误:在展开可选值时意外发现 nil”并且不知道如何解决。

这是我尝试过的:

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】:

你有几个问题。

问题 1:UITableViewController 未设置为托管任何而是表格视图。它的内容视图被锁定为表格视图。如果你想要一个由UITableViewController 管理的表视图并且你想要视图控制器中的其他内容,你需要使UITableViewController 成为另一个视图控制器的子视图。好消息是,使用容器视图和嵌入 segue 非常容易。

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

【讨论】:

以上是关于从另一个类访问 UISegmentedControl @IBOoutlet的主要内容,如果未能解决你的问题,请参考以下文章

从另一个类访问 UI 图像

从另一个类 c++ 访问 UI 元素

UIImageView 范围。从另一个类访问

从另一个类访问 viewController 元素

从另一个类访问 MainWindow 类成员

从另一个类访问 UISegmentedControl @IBOoutlet