2014-08-27 6 views
0

Я сделал нестандартное представление.
Я поставил два стартовых методов,
1. initWithFrame (для инициализации кода)
2. initWithCoder (для раскадровки инициализации)Установить объект делегата для пользовательского класса

В моем пользовательском классе

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // [self setUp] method contain the code to run the delegate. 
     [self setUp]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // [self setUp] method contain the code to run the delegate. 
     [self setUp]; 
     self.backgroundColor = [UIColor greenColor]; 
    } 
    return self; 
} 

Затем я добавляю вид на раскадровки и изменить класс в инспекторе идентификации. Я подключаю представление к свойству viewcontroller.

Я установил делегата и данные источника

На мой взгляд, контроллер

@interface ViewController() <UIControlViewDataSource, UIControlViewDelegate> 

@property (weak, nonatomic) IBOutlet UIControlView *controlView; 

@end 

- (void)viewDidLoad 
{ 
    self.controlView.delegate = self; 
    self.controlView.dataSource = self; 
} 

initWithCoder работает до того viewDidLoad,

Из-за этого делегат никогда не будет работать, потому что в initWithCoder в моей пользовательский класс выполняется до того, как я установил делегат в viewDidLoad в контроллере просмотра.
И свойство делегата будет иметь значение NULL.

Как я могу установить делегат?

+0

Почему вы думаете, прежде чем устанавливать делегат, который не должен вызывать initWithCoder? – Pawan

+0

@pawan initWithCoder запускает метод [self setUp], который содержит код для объединения данных из метода делегата, если делегат еще не установлен, метод не может быть запущен –

ответ

1

Если вы инстанцирование этих объектов из XIb или раскадровки (который он выглядит, как вы основаны на IBOutlet, вы должны установить делегат в -(void)awakeFromNib

На данный момент всех розетки были установлены.

вы не должны зависеть от порядка, в котором объекты получить экземпляр. вы должны позволить им все получить экземпляр, выходы установить, а затем делать все, что вам нужно сделать с делегатом

+0

Не повезло. Правильно, что awakeFromNib на диспетчере представлений работает перед initWithCoder в пользовательском классе, но я не могу установить делегат, потому что пользовательский класс еще не инициализирован, и я не могу получить доступ к его свойству. –

0

Ваша проблема не становится набор делегатов, а скорее ваш объект requir делегат на строительство. Делегат должен быть необязательным.

Независимо от того, что ваш UIView требует своего делегата, это, скорее всего, то, что может быть вытолкнуто из фактического конструктора. Если вы хотите, чтобы делегат автоматически устанавливался во время процесса загрузки nib, вы можете объявить его как свойство IBOutlet в своем представлении. Он все равно будет установлен после его инициализации.

Не уточняя, почему вам нужно позвонить делегату, невозможно сказать, где вы можете отложить эту логику.

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