Мога ли да покажа 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 трябва да съхраня View, защото когато трябва да се върна назад, имам нужда MainMenu да показва последните опции. Опитах се да копирам своя изглед в друг UIView, преди да премахна, и след това да възложа отново, но нищо не се случва, защото не мога да копирам UIView. Втори проблем, когато завъртя симулатора, self.firstMenu не се завърта. self.firstMenu е изглед с бутоните/опциите - person user1600801; 07.09.2012

Първо, didFinishLaunchingWithOptions: е твърде рано да се обажда на presentModalViewController. Дори все още нямате интерфейс!

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

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

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