2013-05-11 119 views
1

我有一個擴展名爲Horizo​​ntalModal的UIViewController的類,其中,我希望在每個視圖上自動生成一個後退按鈕,以擴展它。如果我將代碼繪製在Horizo​​ntalModal的viewDidLoad方法中的後退按鈕,則不會顯示任何內容。但是當我將相同的代碼放在繼承自Horizo​​ntalModal的類的viewDidLoad方法中時,該按鈕顯示正常。訪問超類的子類屬性

E.g:

self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)]; 
[self.view addSubview:self.backButton]; 

在我看來,我失去了一些關於類擴展和繼承客觀C.顯然self.view在Horizo​​ntalModal和self.view在子類指的是兩個不同的東西。那麼是否有辦法在Horizo​​ntalModal類中保留該方法,但是能夠將後退按鈕添加到子類視圖? IE,我可以從超類訪問子類屬性嗎?或者有沒有不同的方式來做到這一點(也許與類別)?

感謝

+0

視圖控制器沒有'-drawRect'方法,因爲它們不是視圖,也不繪製任何東西。也許你的意思是'Horizo​​ntalModal'擴展了'UIView'? – Caleb 2013-05-11 06:03:11

+0

您是否偶然嘗試實現可以​​使用NavigationController實現的功能,一旦推入了新的控制器,就會提供後退按鈕以彈出到前一個控制器? – Anupdas 2013-05-11 06:05:12

+0

對不起,意思是viewDidLoad。不,我不想使用內置的導航控制器,因爲我沒有完全控制UI(IE,我無法設計我想要的後退按鈕樣式,而且我也無法設計頂部酒吧我想如何)。無論如何,即使我這樣做,我的問題是我如何設置超級和子類,使超級可以訪問子類的視圖。 – jraede 2013-05-11 06:06:24

回答

3

如果我把代碼繪製在viewDidLoad方法 爲Horizo​​ntalModal後退按鈕,什麼也不顯示。但是當我將相同的代碼 放在繼承自 Horizo​​ntalModal的類的viewDidLoad方法中時,該按鈕顯示正常。

這聽起來像你的子類的-viewDidLoad不調用它的父類的-viewDidLoad,如:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // subclass-specific view setup stuff here 
} 

這使得超類的版本-viewDidLoad首先做它的事,其次是無論子類需要做的。

我可以從超類訪問子類屬性嗎?或者是否有一個不同的方式來做到這一點(可能與類別)?

如果超類需要每個子類都要提供的方法,那麼應該將該方法放在超類中,並讓子類重寫它。通常,子類的方法實現調用超類的版本,但如果這是需要那麼您應該記錄該事實。

屬性也是如此:如果您的超類需要訪問子類的某些屬性(例如backButton),則超類應該自定義該屬性。然後子類可以自由更改屬性的值,甚至可以提供不同的屬性訪問器,並且使用該屬性的超類中的代碼將正常工作。一般來說,超類不應該知道任何關於它的子類。

所以,要更加具體,讓我們說你有MyModalHorizontalModal一個子類:

@interface HorizontalModal : UIViewController 

@property(strong) UIView *backButton; 

@end 

@implementation HorizontalModal 

- (void)viewDidLoad 
{ 
    self.backButton = [[BackButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)]; 
    [self.view addSubview:self.backButton]; 
} 

@end  

@interface MyModal : HorizontalModal 
//... 
@end 

@implementation MyModal 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // more code specific to MyModal's view hierarchy 
} 

@end 

現在的HorizontalModal-viewDidLoad方法將能夠訪問backButton財產,即使MyModal改變了該屬性的值或覆蓋訪問器。請記住self指向兩個版本的-viewDidLoad中的完全相同的對象,因此兩個版本都可以訪問相同的信息。

+0

哈,本來可以發誓我做到了,但我想我錯過了它。謝謝。 – jraede 2013-05-11 15:15:29