Я хотел бы создать собственный метод init для UIViewController
, но после копания в Интернете и, в частности, в SO, я запутался в назначенных инициализаторах.
У меня есть подкласс 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:
, а не между initWithFilename:
и initWithNibNameOrNil:bundle:
?
Если это невозможно, как я могу реализовать метод инициализатора, который получает пользовательские данные для создания и настройки представления?
Спасибо!