如何从另一个类访问IBOutlet

时间:2015-02-05 12:45:13

标签: ios iphone swift iboutlet

我想知道如何从另一个类

访问类中声明的@IBOutlet

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

class MyFirstView: UIViewController {

    @IBOutlet var lblred: UILabel! = UILabel()
}

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

class MySecondView: UIViewController {

    func modify() {
        let mfv = MyFirstView()
        mfv.lblred.text = "Hello"
    }
}

但没有任何反应 我已将lblred与故事板标签相关联。我在网上搜索了很多关于这个但我无法找到可以解决我问题的那个。请帮我解决这个问题。

谢谢。

3 个答案:

答案 0 :(得分:15)

@Sheen对你的直接问题是正确的,但你的问题更深入。没有对象应该访问另一个对象的IBOutlets。它没有明确定义将会发生什么。这是ObjC代码中的一个长期错误来源,Swift将这些常见错误升级为崩溃。

在加载视图之前,不会分配IBOutlet。这意味着如果视图控制器已分配但尚未放在屏幕上,则IBOutlets仍为零。访问一个隐式解包的nil会使Swift崩溃。

视图控制器只应与其子视图控制器通信。它们不应与系统中的任意视图控制器通信。任意视图控制器之间的通信是通过模型完成的。一个视图控制器更新模型,另一个视图控制器从模型中读取。这是Cocoa大部分构建的Model-View-Controller模式。

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

答案 1 :(得分:4)

问题出在这里:

var lblred : UILabel! = UILabel()

您在此处创建新标签。这打破了你的IBOutlet连接。你只需要

@IBOutlet var lblred : UILabel!

答案 2 :(得分:0)

它不是从另一个类调用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";
}