Показать ViewControllerA из ViewControllerB - PullRequest
0 голосов
/ 20 марта 2011

У меня есть rootController и 5 contentControllers, каждый в своем классе.

Я хочу иметь возможность вызывать следующий контроллер содержимого из текущего контроллера содержимого. Например, если я сейчас показываю contentController1, мне нужен способ показать contentController2.

Было бы идеально, если бы я мог добавить короткий метод в файл реализации каждого контроллера, который передал номер контроллера, который должен быть вызван, фактическому методу, который загружает и показывает новый контроллер.

Например:

@implementation ContentController1

- (int) loadNextController {
  //take the 1 from ContentController1, add 1 to it, and pass it somewhere else
}

Затем в другом месте (корневой контроллер? Делегат приложения?) Добавьте следующий метод, который затем загружает и показывает contentController на основе int, отправленного из метода (int) loadNextController:

-(void) loadNextController: (int) nextController {
//init and show controller
}

Если бы вы могли показать мне код и, что более важно, куда он идет , я был бы очень признателен.

Тревор

1 Ответ

0 голосов
/ 08 апреля 2011

Непонятно, как именно вы хотите, чтобы эти контроллеры представления были связаны друг с другом.Например, вы можете по очереди помещать каждый из них в стек контроллера навигации, чтобы у пользователя всегда была возможность вернуться назад к предыдущим контроллерам представления.Либо у вас может быть требование, согласно которому пользователь должен последовательно проходить пять контроллеров без возможности вернуться назад, и в этом случае вы, вероятно, установите свойство rootViewController окна для каждого контроллера, когда придет время.Ваше решение будет определять, как вы пишете код, который представляет представление каждого контроллера.Прочитайте View Руководство по программированию контроллера для получения подробной информации.

Конструкция, которую вы описываете выше, имеет каждый контроллер представления, который решает, какой контроллер представления представить следующим.Это часто уместно, особенно когда контроллеры представления образуют иерархию.Из вашего описания, тем не менее, кажется, что было бы полезно сконцентрировать все знания о последовательности, в которой контроллеры представлены в одном объекте.Сделайте этот объект делегатом каждого контроллера, и пусть этот объект (возможно, делегат приложения) определит порядок контроллеров.В качестве (непроверенного) примера вы можете добавить это к своему делегату приложения:

-(void)application:(UIApplication*)app didFinishLaunchingWithOptions:(NSDictionary*)options
{
    //...
    self.controllers = [NSArray arrayWithObjects:
                   [[[ViewControllerA alloc] initWithNibName:nil bundle:nil] autorelease],
                   [[[ViewControllerB alloc] initWithNibName:nil bundle:nil] autorelease],
                   //...
                   [[[ViewControllerN alloc] initWithNibName:nil bundle:nil] autorelease]];

    // Make self the delegate for each of the view controllers.
    [self.controllers setValue:self forKey:@"delegate"];

    [self.navigationController pushViewController:[self.controllers objectAtIndex:0] animated:NO];
}

-(void)viewControllerDidFinish:(UIViewController*)controller
{
    NSUInteger index = [self.controllers indexOfObject:controller];
    NSUInteger nextIndex = index + 1;

    if (nextIndex < [self.controllers count]) {
        [self.navigationController pushViewController:[self.controllers objectAtIndex:nextIndex animated:YES];
    }
}

Затем, когда контроллер представления готов переключиться на следующий контроллер, он может просто вызвать:

[self.delegate viewControllerDidFinish:self];

Опять же, идея заключается в том, что порядок контроллеров представления в массиве определяет порядок, в котором будут представлены контроллеры.Я использовал навигационный контроллер здесь, но вам не нужно.Кроме того, вы, вероятно, захотите объявить протокол с помощью метода -viewControllerDidFinish: (UIViewController *), принять этот протокол в делегате вашего приложения (или в зависимости от того, какой объект управляет контроллерами), и чтобы свойства делегата ваших контроллеров указывали этот протокол.Это позволит избежать любых предупреждений о том, что делегат не реализует метод.

...