Swift : 如何从另一个控制器设置 IBOutlet?
Swift : How to set IBOutlet from another controller?
我想隐藏我的 IBOutlet。但是,将文本设置为 empy 字符串工作得很好,但是当我直接访问我的 IBOutlet 时,我不断收到 "unexpectedly found nil while unwrapping optional value" 的错误。
我尝试将我的 IBOutlet 设置为本地变量,但它也报错。我准备了一些删除了不相关行的代码片段,以便在不提供太多代码的情况下更好地暴露我的问题:
PageContentViewController
@IBOutlet weak var LabelTop: UILabel!
var Test:UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.LabelTop = self.Test
}
PageViewController
func viewControllerAtIndex(index: Int)-> PageContentViewController?{
if((self.pageTitles.count == 0) || (index >= self.pageTitles.count))
{
return nil
}
var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
pageContentViewController.imageFile = self.pageImages[index]
pageContentViewController.titleText = self.pageTitles[index]
pageContentViewController.pageIndex = index
if(index == 2){
pageContentViewController.Test.hidden = true
}
else {
pageContentViewController.Test.hidden = false
}
return pageContentViewController
}
试图访问 if 语句中的 UIlabel 时程序崩溃。显然,正如我之前所说,我可以轻松访问文本 属性 并将其设置为空字符串,但我想知道为什么 IBOutlet 无法通过这种方式访问。
提前致谢!
您遇到的问题是,您在 viewControllerAtIndex
方法中尝试设置插座,但视图控制器 (PageContentViewController) 未加载到视图层次结构中,因此插座仍然为零。
您可以使用的解决方案之一是向 PageContentViewController 添加 属性 例如 isHidden
并在 viewDidAppear 中检查 属性 并隐藏或显示视图:
var isHidden:Bool = true
override func viewDidAppear(animated: Bool) {
superviewDidAppear(animated)
self.Test.hidden = isHidden
}
在viewControllerAtIndex
方法中将测试控件的设置隐藏属性的行更改为isHidden:
if(index == 2){
pageContentViewController.isHidden = true
}
else {
pageContentViewController.isHidden = false
}
您已声明 " var Test:UILabel! "
即 not optional
,
所以在这种情况下,首先你必须初始化它。
你是直接访问它的属性而不初始化,这是不可能的。
要么您需要将 Test 创建为 " var Test:UILabel? "
,然后以编程方式创建 Test 并设置其所有其他属性,如文本和所有。
或者您可以在下一个 class PageContentViewController
中创建 Boolean variable
,设置布尔变量值而不是设置 " pageContentViewController.Test.hidden "
值,然后在 PageContentViewController
之后hide/show 你的标签。
我想隐藏我的 IBOutlet。但是,将文本设置为 empy 字符串工作得很好,但是当我直接访问我的 IBOutlet 时,我不断收到 "unexpectedly found nil while unwrapping optional value" 的错误。
我尝试将我的 IBOutlet 设置为本地变量,但它也报错。我准备了一些删除了不相关行的代码片段,以便在不提供太多代码的情况下更好地暴露我的问题:
PageContentViewController
@IBOutlet weak var LabelTop: UILabel!
var Test:UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.LabelTop = self.Test
}
PageViewController
func viewControllerAtIndex(index: Int)-> PageContentViewController?{
if((self.pageTitles.count == 0) || (index >= self.pageTitles.count))
{
return nil
}
var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
pageContentViewController.imageFile = self.pageImages[index]
pageContentViewController.titleText = self.pageTitles[index]
pageContentViewController.pageIndex = index
if(index == 2){
pageContentViewController.Test.hidden = true
}
else {
pageContentViewController.Test.hidden = false
}
return pageContentViewController
}
试图访问 if 语句中的 UIlabel 时程序崩溃。显然,正如我之前所说,我可以轻松访问文本 属性 并将其设置为空字符串,但我想知道为什么 IBOutlet 无法通过这种方式访问。
提前致谢!
您遇到的问题是,您在 viewControllerAtIndex
方法中尝试设置插座,但视图控制器 (PageContentViewController) 未加载到视图层次结构中,因此插座仍然为零。
您可以使用的解决方案之一是向 PageContentViewController 添加 属性 例如 isHidden
并在 viewDidAppear 中检查 属性 并隐藏或显示视图:
var isHidden:Bool = true
override func viewDidAppear(animated: Bool) {
superviewDidAppear(animated)
self.Test.hidden = isHidden
}
在viewControllerAtIndex
方法中将测试控件的设置隐藏属性的行更改为isHidden:
if(index == 2){
pageContentViewController.isHidden = true
}
else {
pageContentViewController.isHidden = false
}
您已声明 " var Test:UILabel! "
即 not optional
,
所以在这种情况下,首先你必须初始化它。
你是直接访问它的属性而不初始化,这是不可能的。
要么您需要将 Test 创建为 " var Test:UILabel? "
,然后以编程方式创建 Test 并设置其所有其他属性,如文本和所有。
或者您可以在下一个 class PageContentViewController
中创建 Boolean variable
,设置布尔变量值而不是设置 " pageContentViewController.Test.hidden "
值,然后在 PageContentViewController
之后hide/show 你的标签。