Могу ли я показать SplitViewController с помощью presentModalViewController?

Я не знаю, возможно ли то, что я пытаюсь сделать, но поскольку у меня нет желаемых результатов, я думаю, что нет.
То, что я пытаюсь сделать, это вызвать SplitViewController из предыдущий ViewController, используя presentViewController.
Я знаю, что SplitViewController должен быть rootViewController, но мне нужно изучить наиболее возможные варианты, чтобы добиться того, что мне нужно сделать.
У меня есть MainMenu с кнопками и с каждую кнопку, мне нужно вызвать SplitViewController. Во-первых, как это сделать?
Я пытаюсь сделать следующее: во-первых, в AppDelegate я вызываю MainMenu и добавляю в качестве подпредставления и другие вещи:

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   [window addSubview:self.mainMenu.view];
   [self.mainMenu presentModalViewController:self.firstMenu animated:NO]; 
   [self.window makeKeyAndVisible];

   return YES;
}

Затем в MainMenu я вызываю SecondViewController в модальном представлении, используя этот код:

SecondViewController *secV = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
secV.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:secV animated:YES];

В этом SecondViewController я создаю SplitViewController с Master и DetailViewController, используя этот код:

-(void)viewDidLoad{
  [super viewDidLoad];
  // Do any additional setup after loading the view from its nib.

  UISplitViewController *splitViewController = [[UISplitViewController alloc]init];

  SecondMenuViewController *secMenu = [[SecondMenuViewController alloc]init];
  UINavigationController *navLef = [[UINavigationController alloc]init];
  [navLef pushViewController:secMenu animated:NO];

  SecondMainViewController *secMain = [[SecondMainViewController alloc]init];
  UINavigationController *navRig = [[UINavigationController alloc]init];
  [navRig pushViewController:secMain animated:NO];

  splitViewController.delegate = secMain;
  splitViewController.viewControllers = [NSArray arrayWithObjects:navLef, navRig, nil];

  MainAppDelegate *mainApp = [[MainAppDelegate alloc]init];
  [mainApp changeRootViewController:splitViewController];

  navRig = nil;
  navLef = nil;
  secMain = nil;
  secMenu = nil;
  splitViewController = nil;
}

Как видите, я вызываю метод в MainAppDelegate, чтобы изменить представление и RootViewController, потому что SplitViewController должен быть RootViewController. Это метод:

-(void)changeRootViewController:(UISplitViewController *)splitViewController{
   [self.window addSubview:splitViewController.view];
   self.window.rootViewController = splitViewController;
}

Я знаю, это выглядит как беспорядок. И когда я запускаю, SplitViewController никогда не отображается, поэтому я предполагаю, что то, что я пытаюсь сделать, невозможно? Или В чем я не прав? Если это все, что я могу сделать, чтобы показать SplitViewController после моего MainViewController?
Я использую XCode4.4 и iOS5 Большое спасибо.


person user1600801    schedule 07.09.2012    source источник


Ответы (2)


Лучшим способом было бы сделать ваш UISplitViewController корневым контроллером представления в application:didFinishLaunchingWithOptions:. Затем поместите свой MainMenu поверх него. Вы можете изменить подпредставления, отображаемые контроллером разделенного представления, чтобы они соответствовали тому, какую кнопку пользователь нажимает в вашем MainMenu.

person torrey.lyons    schedule 07.09.2012
comment
Спасибо... Этот вариант кажется быстрым и полезным. Я уже протестировал его, но теперь у меня есть 2 проблемы. Первый: в моем MainMenu мне нужно сохранить представление, потому что, когда мне нужно вернуться, мне нужно, чтобы MainMenu показывал последние варианты. Я пытался скопировать свой View в другой UIView перед удалением, а потом переназначить, но ничего не происходит, т.к. не получается скопировать UIView. Вторая проблема, когда я поворачиваю симулятор, self.firstMenu не вращается. self.firstMenu — это вид с кнопками/опциями - person user1600801; 07.09.2012

Во-первых, didFinishLaunchingWithOptions: еще слишком рано звонить presentModalViewController. У тебя еще даже нет интерфейса!

Во-вторых, у вас, похоже, нет корневого контроллера представления (хотя, возможно, вы получаете его из пера? Вероятно, вам следует прекратить это делать; используйте методы, показанные в текущих шаблонах приложений).

В-третьих, обратите внимание, что теперь, когда у нас есть настраиваемые представления контейнеров, вам вообще не нужно использовать UISplitViewController; вы можете построить свою собственную иерархию контроллера представления/представления, и вы можете быть счастливее, поскольку UISplitViewController не очень хорошо сконструированный класс.

person matt    schedule 07.09.2012
comment
Спасибо. Звучит здорово построить свою собственную иерархию ViewController, притворяясь SplitViewController, я попробую, но я только новичок, и если мне сложно использовать то, что уже сделано, сделать это самому будет очень большая проблема.. Спасибо за совет - person user1600801; 07.09.2012
comment
Дополнительная информация о том, как создать собственную иерархию контроллеров представления, содержится в моей книге: apeth.com/iOSBook/ ch19.html#_container_view_controllers - person matt; 07.09.2012
comment
Спасибо, что поделились своим материалом - person user1600801; 08.09.2012