2012-07-08 100 views
3

我正在爲iPhone應用程序的界面工作。我意識到我有不同的視圖重複對象,所以我想做一個父ViewController。但是現在,當我想從一個子ViewController訪問這個父ViewController的屬性時,我遇到了一些問題。具體而言,我希望在每個視圖中都有一個普通的ProgressView,但是我希望它在View出現時隱藏。當我從子ViewController訪問ProgressView.hidden以獲取ProgressView時,我看不到任何錯誤消息,但在運行的程序中沒有任何反應。如何在Objective-C中正確訪問父類的屬性?

我的代碼看起來是這樣的:

ParentViewController.h:

#import <UIKit/UIKit.h> 

@interface ParentViewController : UIViewController{ 
    UIProgressView *progressView; 
} 

@property (readwrite) UIProgressView *progressView; 

@end 

ParentViewController.m:

- (void)viewDidLoad 
{ 

    CGRect progressViewFrame = CGRectMake(0, 407, 320, 9); 
    progressView = [[UIProgressView alloc] initWithFrame:progressViewFrame]; 
    progressView.hidden = TRUE; 
    [self.view addSubview:progressView]; 

    [super viewDidLoad]; 
} 

ChildViewController.h:

#import <UIKit/UIKit.h> 
#import "ToolbarViewController.h" 

@interface ChildViewController : ParentViewController 

@end 

ChildViewControlle rm:

- (void)viewDidLoad 
{ 
    progressView.hidden = FALSE; 

    [super viewDidLoad]; 
} 

如果我這樣做ProgressView酒吧保持隱藏,我沒有得到任何錯誤。我還檢查了viewDidLoad方法是否被調用,是的,它被調用。

問候 C4rmel

回答

3

在ChildViewController.m,調用序列的功能是不正確。 通過以下方式更改它:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    progressView.hidden = FALSE;  
} 

這裏調用super將創建progressView。然後你可以隱藏它。否則,你隱藏了一個甚至沒有創建的視圖。

4

在致電[super viewDidLoad];之前致電progressView.hidden = FALSE;progressView尚未初始化;它仍然是nil,所以分配不起作用。

+0

謝謝!我知道它必須是一點點。 – C4rmel 2012-07-08 17:03:06

+1

我認爲他應該保持它在viewDidLoad或將其移動到loadView。視圖控制器不應該在init上創建視圖。無論如何,子類viewDidLoad可以先調用super。 – 2012-07-08 17:04:50

+0

我同意@ranReloaded。如果他以編程方式創建視圖,則應該在'-viewDidLoad'或'-loadView'中。 – 2012-07-08 17:06:29