2015-02-05 5 views
12

Я хочу знать, как получить доступ к @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" 
    } 
} 

Но ничего Happe нс.
Я подключил lblred с меткой раскадровки. Я много искал об этом в Интернете, но я не могу найти тот, который может решить мою проблему. Пожалуйста, помогите мне решить эту проблему.

спасибо.

+0

отформатируйте код –

ответ

4

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

var lblred : UILabel! = UILabel() 

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

@IBOutlet var lblred : UILabel! 
+0

@cjwirth, спасибо –

+1

Когда я делаю это, результат показать это: фатальную ошибку: неожиданно обнаружил ноль, а разворачивание необязательного значения –

+0

Это показывает ошибку, что IBOutlet не имеет дополнительный типа UILabel. Однако, спасибо, что помогли мне –

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"; 
} 
13

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

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

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

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

+0

, Вы правы. Благодарю. –

Смежные вопросы