#objective-c #uiviewcontroller
#objective-c #uiviewcontroller
Вопрос:
У меня есть два контроллера, First- and SecondViewController
. Я хочу поделиться некоторыми методами FirstViewController, чтобы использовать их в моем SecondViewController.
Вот как я создаю SecondViewController в FirstViewController:
sms = [[SecondViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
initWithRootViewController:sms];
[self presentModalViewController:navController animated:YES];
Я подумал о передаче текущего экземпляра FirstViewController второмуviewcontroller, который расширяется UIViewController
. По умолчанию вызывается метод initWithNibName второго ViewController.
Как мне достичь этого в objective-c?
Комментарии:
1. вы спрашиваете, как передать FirstViewController во SecondViewController в методе init без использования инициализатора initWithNibName?
2. Я не вызываю метод initWithNibName, похоже, он вызывается автоматически, однако я ценю любые предложения о том, как передать первый во второй контроллер просмотра
Ответ №1:
Я не совсем уверен, что понимаю проблему … поскольку часть проблемы связана с тем, как вы создаете экземпляр SecondViewController … публикация этого кода могла бы помочь.
но чтобы ответить на ваш вопрос так, как вы его задали…. «как передать FirstViewController во SecondViewController»…
в вашем SecondViewController.h создайте свой собственный метод инициализации
-(id) initWithFirstViewController:(UIViewController *)theFirstViewController;
и в файле .m…
-(id) initWithFirstViewController:(UIViewController *)theFirstViewController
{
self = [super initWithNibName:@"myNibName" bundle:nil];
self.firstViewController = theFirstViewController; //this assumes you have created this property. Also, do NOT retain the first view controller or you will get circular reference and will secondviewcontroller will leak.
return self;
}
затем .. и вот ключ.. убедитесь, что вы вызываете правильный метод init для создания экземпляра SecondViewContoller
SecondViewController *svc = [[SecondViewController alloc]initWithFirstViewController:self];
теперь .. сказав это .. глядя на ваш рейтинг SO, у меня такое чувство, что вы уже знали это .. и реальный вопрос может быть… почему вызывается initWithNibName, когда вы на самом деле не вызываете его явно?
Ответ №2:
Не уверен на 100%, что вам нужно. Содержание вашего вопроса о методах совместного использования, похоже, не соответствует вопросу о передаче параметра при инициализации.
Что касается методов, вы можете вызвать метод из вашего parentViewController
if ([self.parentViewController respondsToSelector:@selector(someMethod)]) {
[self.parentViewController someMethod];
}
Если вы хотите передать параметр в любом классе в init
, вам нужно будет написать пользовательский init
метод с любыми дополнительными параметрами, которые вы хотите. Этот пользовательский метод должен начинаться с соответствующего [self init]
вызова. У вас даже может быть несколько пользовательских init
методов, которые могут быть удобны.
Вот пример для класса, который загружает каналы в формате json или xml.
- (id)initWithID:(NSString *)useID delegate:(id)setDelegate urlString:(NSString *)urlString feedIsJSON:(BOOL)feedIsJSON failedRetrySecondsOrNegative:(float)failedRetrySecondsOrNegative refreshSecondsOrNegative:(float)refreshSecondsOrNegative {
if ((self = [super init])) {
// Custom initialization
processing = NO;
self.delegate = setDelegate;
self.feedID = [NSString stringWithFormat:@"%@", useID];
self.feedURLString = [NSString stringWithFormat:@"%@", urlString];
self.isJSON = feedIsJSON;
if (failedRetrySecondsOrNegative>=0.0f) {
retryFailedSeconds = failedRetrySecondsOrNegative;
} else {
retryFailedSeconds = kFailedRefresh;
}
if (refreshSecondsOrNegative>=0.0f) {
refreshSeconds = refreshSecondsOrNegative;
} else {
refreshSeconds = kSuccededRefresh;
}
}
return self;
}
Надеюсь, это поможет.