我想知道如何从另一个类
访问类中声明的@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
与故事板标签相关联。我在网上搜索了很多关于这个但我无法找到可以解决我问题的那个。请帮我解决这个问题。
谢谢。
答案 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";
}