Как я могу передать параметр при инициализации UIViewController?

#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;
}
  

Надеюсь, это поможет.