2014-08-27 47 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 2014-08-27 20:50:29

+0

@pawan initWithCoder運行[self setUp]方法,該方法包含從委託方法中彙集數據的代碼,如果委託尚未設置,則該方法無法運行 – 2014-08-28 10:08:07

回答

1

如果您實例從廈門國際銀行或故事板(這看起來你是基於IBOutlet這些對象,你應該設置你的委託在-(void)awakeFromNib

此時所有的網點已經設定。

你不應該依賴的順序內的對象實例化。你應該讓他們都得到實例化,網點設置,然後做你需要做的與委派

+0

沒有運氣,正確的是viewcontroller上的awakeFromNib正在運行在自定義類中的initWithCoder之前,但我無法設置委託,因爲自定義類尚未初始化,我無法訪問它的屬性。 – 2014-08-27 19:04:32

0

您的問題沒有得到代表集,而是你的對象要求成爲建築代表。代表應該是一個可選屬性。

無論您的UIView需要它的委託的操作是什麼,都可能被推出實際的構造函數。如果您希望在筆尖加載過程中自動設置代理,則可以在視圖中將其聲明爲IBOutlet屬性。它在初始化後仍然會被設置。

沒有得到關於爲什麼需要調用委託的更多詳細信息,不可能說出您可以在何處推遲該邏輯。