如何从另一个class级访问IBOutlet

我想知道如何访问另一个类中声明的@IBOutlet

例如,我有一个名为myfirstview的类

class MyFirstView: UIViewController { @IBOutlet var lblred: UILabel! = UILabel() } 

我想从另一个.swift文件中另一个名为MySecondView类中更改lblred的文本:

 class MySecondView: UIViewController { func modify() { let mfv = MyFirstView() mfv.lblred.text = "Hello" } } 

但没有任何反应。
我连接了一个故事板标签lblred 。 我在网上search了很多关于这方面的信息,但找不到能解决我的问题的方法。 请帮我解决这个问题。

谢谢。

谢恩对你的眼前的问题是正确的,但是你的问题更深。 没有对象应该访问另一个对象的IBOutlets。 这不是很好的定义会发生什么。 这已经是ObjC代码中的一个很长的bug了,Swift将这些常见的错误升级为崩溃。

在加载视图之前,不会分配IBOutlet。 这意味着如果视图控制器被分配但还没有被放在屏幕上,IBOutlets仍然是零。 访问一个隐式解包的nil将会使Swift崩溃。

视图控制器应该只与他们的子视图控制器通信。 他们不应该与系统中的任意视图控制器进行通信。 任意视图控制器之间的通信通过模型完成。 一个视图控制器更新模型,另一个视图控制器读取模型。 这是Cocoa大部分构build的模型 – 视图 – 控制器模式。

视图控制器可以更直接地与他们的孩子交互,但是仍然不应该直接修改IBOutlet。 他们应该设置属性。 子视图控制器有责任在正确的时间将该数据从属性移动到标签(可能必须等到viewDidLoad() )。 这就是为什么它被称为“视图控制器”。 它是负责其观点的一个对象。 没有人应该惹他们。

问题在这里:

 var lblred : UILabel! = UILabel() 

你在这里创build一个新的标签。 这打破了你的IBOutlet连接。 你只需要

 @IBOutlet var lblred : UILabel! 

它不是推荐的从另一个class级调用IBOutlet的方法。 如果你想打电话或访问一个IBOutlet,那么你应该将其设置为属性,然后访问它。

例如:

 //ViewControler.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *label; @end //abc.m #import <UIKit/UIKit.h> #import <ViewController.h> @interface abc @end @implementation abc - (void)viewDidLoad { [super viewDidLoad]; ViewController *viewCOntroller= [ViewController alloc] init]; viewCOntroller.label.text = @"Hello"; }