如果我把代碼繪製在viewDidLoad方法 爲HorizontalModal後退按鈕,什麼也不顯示。但是當我將相同的代碼 放在繼承自 HorizontalModal的類的viewDidLoad方法中時,該按鈕顯示正常。
這聽起來像你的子類的-viewDidLoad
不調用它的父類的-viewDidLoad
,如:
- (void)viewDidLoad
{
[super viewDidLoad];
// subclass-specific view setup stuff here
}
這使得超類的版本-viewDidLoad
首先做它的事,其次是無論子類需要做的。
我可以從超類訪問子類屬性嗎?或者是否有一個不同的方式來做到這一點(可能與類別)?
如果超類需要每個子類都要提供的方法,那麼應該將該方法放在超類中,並讓子類重寫它。通常,子類的方法實現調用超類的版本,但如果這是需要那麼您應該記錄該事實。
屬性也是如此:如果您的超類需要訪問子類的某些屬性(例如backButton
),則超類應該自定義該屬性。然後子類可以自由更改屬性的值,甚至可以提供不同的屬性訪問器,並且使用該屬性的超類中的代碼將正常工作。一般來說,超類不應該知道任何關於它的子類。
所以,要更加具體,讓我們說你有MyModal
的HorizontalModal
一個子類:
@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
中的完全相同的對象,因此兩個版本都可以訪問相同的信息。
視圖控制器沒有'-drawRect'方法,因爲它們不是視圖,也不繪製任何東西。也許你的意思是'HorizontalModal'擴展了'UIView'? – Caleb 2013-05-11 06:03:11
您是否偶然嘗試實現可以使用NavigationController實現的功能,一旦推入了新的控制器,就會提供後退按鈕以彈出到前一個控制器? – Anupdas 2013-05-11 06:05:12
對不起,意思是viewDidLoad。不,我不想使用內置的導航控制器,因爲我沒有完全控制UI(IE,我無法設計我想要的後退按鈕樣式,而且我也無法設計頂部酒吧我想如何)。無論如何,即使我這樣做,我的問題是我如何設置超級和子類,使超級可以訪問子類的視圖。 – jraede 2013-05-11 06:06:24