2015-10-17 85 views
0

我的目标是更新UIViewController标签的text xib文件的属性。该标签在UIView子类中用IBOutlet连接声明。如何在iOS视图中访问我的视图中的子类成员?

let myView = myClass() 
myView.myLabel!.text = "Hello!" 

该标签似乎是nil。实际上,我收到以下运行时错误:fatal error: unexpectedly found nil while unwrapping an Optional value。如果我不打开可选件,程序将运行,但标签不会更新其text。 如何避免我的应用程序标记标签为nil?

底线:如果我理解正确的是我必须声明两个UIViews在我UIViewController。一个加载笔尖,另一个只更新标签。但它们都在同一个xib文件上运行。这是正确的方法吗?

+0

你'viewDidLoad'后调用此? – Andy

+0

@安迪,正确。我也尝试将'myView'变量设为全局变量,然后更改'viewDidLoad'中的标签。 – Cesare

+0

所以'myClass'是一个UIView子类,对吧? 'myLabel'是否在'myClass()'的init方法中实例化? – Andy

回答

1

The label is declared in the UIView subclass with a IBOutlet connection.

我相信你正在服用约myClass这里这是UIView一个子类。如果您已将其添加到您的UIViewController的XIB中并通过IBOutlet连接,那么您不需要在此重新初始化它let myView = myClass()

通过这样做,您可以创建另一个对象,该对象不会在您的UIViewController中显示,所以如果有效地更改此对象的UILabel属性,则不会更改您的用户界面。

当你正确连接的IBOutlet,它应该出现类似下面你迅速类文件:

@IBOutlet weak var myView : myClass? 

然后在你的viewDidLoad功能,您可以拨打self.myView.myLabel!.text = "Hello!"看到的变化。

编辑:发表评论OP:

要加载UIView使用下列内容:

self. myView = NSBundle.mainBundle().loadNibNamed("myXib", owner: self, options: nil)[0] as? myView 
+0

如果不将自定义的'UIView'链接到'UIViewController'上的'XIB'文件中,就无法创建'IBOutlet'。你有2个选项 - 1)拖放一个UIView到你的'ViewController'的'XIB'文件中,并将该类改为'myView'。然后像我在文章中提到的那样使用它。2)直接在ViewController的'loadView'函数中初始化你的自定义视图,就像我在我编辑的文章中提到的那样。然后将该视图添加为UIViewController视图的子视图。 – Abhinav

+0

感谢您的编辑。我做了你所说的,我全局声明了'var myView:UIView!',然后在'viewDidLoad'中加载了xib文件(我使用了你发布的代码)。但是,我不能访问子类的成员:'类型'UIView'的值没有成员'myLabel'。 – Cesare

+0

你不应该声明它的类型为'UIView'。它必须是你自定义视图的类型,因为'myLabel'是你的自定义视图的属性,而不是'UIView',所以它应该看起来像'var myView:MyView!'。 – Abhinav

1

当您尝试将文本设置为"Hello!时,myLabel仍可能是nil。做一些日志记录来验证这一点。

myLabel仍然是nil,因为您的myView对象尚未从nib中加载它的视图。您可以通过将其添加为子视图来强制执行此负载,然后将文本设置为任何您喜欢的内容。

相关问题