Как получить доступ к 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 с меткой раскадровки. Я много искал об этом в Интернете, но я не могу найти тот, который может решить мою проблему. Пожалуйста, помогите мне решить эту проблему.

Спасибо.

Ответ 1

@Sheen правильно относится к вашей непосредственной проблеме, но ваша проблема глубже. Ни один объект не должен обращаться к другому объекту IBOutlets. Он не совсем определил, что произойдет. Это был длинный источник ошибок в коде ObjC, и Swift эскалирует эти общие ошибки при сбоях.

IBOutlets не назначаются до загрузки представления. Это означает, что если контроллер просмотра выделен, но еще не был помещен на экран, то IBOutlets все еще ноль. Доступ к неявно развернутому нолю приведет к сбою Swift.

Контроллеры просмотра должны взаимодействовать только со своими контроллерами просмотра детей. Они не должны связываться с произвольными контроллерами представлений в системе. Связь между произвольными контроллерами представлений выполняется с помощью модели. Один контроллер просмотра обновляет модель, а другой контроллер просмотра считывает из модели. Это шаблон Model-View-Controller, в котором построена большая часть Cocoa.

Контроллеры просмотра могут взаимодействовать напрямую со своими детьми, но не должны изменять IBOutlets напрямую. Они должны устанавливать свойства. Контроллер диспетчера детского представления должен переместить эти данные из свойства на метку в правильное время (что, возможно, придется ждать до viewDidLoad()). Вот почему он назвал "контроллер просмотра". Это один объект, ответственный за его взгляды. Никто больше не должен с ними связываться.

Ответ 2

Проблема здесь:

var lblred : UILabel! = UILabel()

Здесь вы создаете новый ярлык. Это нарушение вашего соединения с IBOutlet. Вам нужно только

@IBOutlet var lblred : UILabel!

Ответ 3

Это не рекомендуемый способ вызова 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";
}