如何在iOS中访问视图中的子类成员?

如何在iOS中访问视图中的子类成员?,ios,uiview,Ios,Uiview,我的目标是更新xib文件的UIViewController标签的text属性。标签在带有IBOutlet连接的UIView子类中声明 let myView = myClass() myView.myLabel!.text = "Hello!" 标签似乎是nil。事实上,我得到了以下运行时错误:致命错误:在展开可选值时意外发现nil。如果我不打开可选文件,程序将运行,但标签不会更新其文本。 如何避免应用程序将标签标记为nil? 底线:如果我理解正确,我必须在我的UIViewController中

我的目标是更新xib文件的
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
上的属性,所以它看起来应该像e
var myView:myView!
。这很有意义。请立即修复。谢谢!