我想爲UIViewController
構建一個自定義的初始化方法,但是在互聯網上進行了深入研究後,特別是在SO中,我對指定的初始化程序感到困惑。如何編寫防止viewDidLoad被調用的自定義初始化程序?
我有一個UIViewController
的與這兩個初始化的子類:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (id) initWithFilename:(NSString *)aFilename {
self = [self initWithNibName:@"WallpaperDetailsViewController" bundle:nil];
if (self) {
self.filename = aFilename;
}
return self;
}
然後,我有一個viewDidLoad
方法,根據filename
屬性定製視圖:
- (void)viewDidLoad {
[super viewDidLoad];
// Create a UIImageView to display the wallpaper
self.wallpaper = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.filename]];
// ...
}
在另一個UIViewController
我撥打以下電話:
WallpaperDetailsViewController *detailsViewController = [[WallpaperDetailsViewController alloc] initWithFilename:@"foobar.png"];
[[self navigationController] pushViewController:detailsViewController animated:YES];
結果是viewDidLoad
由於[self initWithNibName:]
而被調用,它不初始化UIImageView
,因爲self.filename
爲空。
根據其他SO問題和答案,這應該是預期的行爲。我是因爲在其他項目之前的iOS 5,我的問題是我自己的經驗,不知道這一點:
我怎樣才能確保viewDidLoad:
是呼叫initWithFilename:
和initWithNibNameOrNil:bundle:
之間initWithFilename:
而不是之後?
如果這不可行,我該如何實現一個接收自定義數據以創建和定製視圖的初始化方法?
謝謝!
如何定義文件名?宣稱的財產或定製配件? – logancautrell
'filename'被定義爲'@property(strong,nonatomic)NSString * filename;'在'WallpaperDetailsViewController'的'@interface'聲明中# – elitalon
正在導致視圖加載的init代碼中發生了一些事情。設置一箇中斷點,看看有沒有負載,看看爲什麼它被調用提前。 – logancautrell