如何在iOS中访问视图中的子类成员?
我的目标是更新xib文件的如何在iOS中访问视图中的子类成员?,ios,uiview,Ios,Uiview,我的目标是更新xib文件的UIViewController标签的text属性。标签在带有IBOutlet连接的UIView子类中声明 let myView = myClass() myView.myLabel!.text = "Hello!" 标签似乎是nil。事实上,我得到了以下运行时错误:致命错误:在展开可选值时意外发现nil。如果我不打开可选文件,程序将运行,但标签不会更新其文本。 如何避免应用程序将标签标记为nil? 底线:如果我理解正确,我必须在我的UIViewController中
UIViewController
标签的text
属性。标签在带有IBOutlet
连接的UIView
子类中声明
let myView = myClass()
myView.myLabel!.text = "Hello!"
标签似乎是nil
。事实上,我得到了以下运行时错误:致命错误:在展开可选值时意外发现nil
。如果我不打开可选文件,程序将运行,但标签不会更新其文本。
如何避免应用程序将标签标记为nil?
底线:如果我理解正确,我必须在我的UIViewController
中声明两个UIViews
。一个加载笔尖,另一个只更新标签。但它们都在同一个xib文件上运行。这是正确的方法吗?当您尝试将文本设置为“Hello!
时,myLabel
很可能仍然是nil
。请进行一些日志记录以验证这一点
myLabel
仍然是nil
,因为您的myView
对象尚未从nib加载其视图。您可能可以通过将其添加为子视图来强制加载,然后将文本设置为任意值
标签在UIView子类中用IBOutlet声明
连接
let myView = myClass()
myView.myLabel!.text = "Hello!"
我相信您在这里使用的是myClass
,它是UIView
的一个子类。如果您已将其添加到UIViewController
的XIB中,并通过IBOutlet
进行连接,则无需在此处重新初始化让myView=myClass()
通过这样做,您正在创建另一个未显示在UIViewController
上的对象,因此此对象的UILabel
属性中的任何更改都不会改变您的UI
正确连接IBOutlet
时,它应该在swift类文件中显示如下内容:
@IBOutlet weak var myView : myClass?
然后在viewDidLoad
函数中,您可以调用self.myView.myLabel!.text=“你好!“
以查看更改
编辑:发表评论:
要加载ui视图
,请使用以下命令:
self. myView = NSBundle.mainBundle().loadNibNamed("myXib", owner: self, options: nil)[0] as? myView
你是在viewDidLoad
之后调用这个吗?@Andy,没错。我还尝试将myView
变量设置为全局变量,然后在viewDidLoad
中更改标签。那么myClass
是UIView子类,对吗?myLabel
是否在myClass()的init方法中实例化了
?是的,myClass
是UIView子类。不,它实际上没有在init方法中实例化。我会研究一下,谢谢@Andy!如果不在UIViewController
上的XIB
文件中链接自定义的UIView
,您就无法创建IBOutlet
。您有两个选项-1)拖放UIView在ViewController
的XIB
文件中,将类更改为myView
。然后按照我在文章中提到的方式使用它。2)直接在ViewController
的loadView
函数中初始化自定义视图,就像我在编辑的文章中提到的那样。然后将该视图添加为uiviewcontroller的子视图er
的视图。感谢您的编辑。我照您说的做了,全局声明了var myView:UIView!
然后加载了xib文件(我使用了您发布的代码)在viewDidLoad
中。但是,我无法访问子类“members:类型为“UIView”的值没有成员“myLabel”
。您不应该将其声明为UIView
类型。它必须是自定义视图的类型,因为myLabel
是自定义视图上的属性,而不是UIView
上的属性,所以它看起来应该像evar myView:myView!
。这很有意义。请立即修复。谢谢!