Как я могу передать параметр при инициализации UIViewController? - PullRequest
0 голосов
/ 30 апреля 2011

У меня два контроллера, First- and SecondViewController. Я хочу поделиться некоторыми методами FirstViewController, чтобы использовать их в моем SecondViewController.

Вот как я создаю SecondViewController в FirstViewController:

sms = [[SecondViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
                                             initWithRootViewController:sms];

[self presentModalViewController:navController animated:YES];

Я думал о передаче текущего экземпляра FirstViewController в SecondViewController, который расширяет UIViewController. По умолчанию вызывается метод initWithNibName для SecondViewController.

Как мне добиться этого в target-c?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

Я не совсем уверен, что понимаю проблему ... как часть проблемы связана с тем, как вы создаете экземпляр 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, когда вы на самом деле не вызываете его явно

1 голос
/ 30 апреля 2011

Не уверен на 100%, что вы после. Содержание вашего вопроса о методах совместного использования не соответствует вопросу передачи параметра в init.

Что касается методов, вы можете вызвать метод из вашего 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...