UISplitViewcontroller с главным UINavigationController и подробным UINavigationController - PullRequest
4 голосов
/ 07 января 2011

У нас есть определенное поведение, которое нам требуется в нашем приложении UISplitViewController. У нас есть следующая иерархия из 3 представлений

  • FormOneViewController - TableViewController, инициализированный в MasterView
  • FormTwoViewcontroller - TableViewCotnroller детально проработан ViewView
  • FormThreeViewcontroller - еще не отображается.

Когда пользователь выбирает элемент в FormTwoViewController, мы хотим, чтобы FormThreeViewCOntroller отображался в detailView, а FormTwoViewController (текущий подробный вид) становился masterView.

Нам также нужно иметь кнопку возврата в подробном представлении, чтобы вернуть стек контроллеров представления. Поэтому, когда нажата кнопка «назад», FormTwoViewController становится detailView, а FormOneViewController снова становится главным представлением.

Мы попытались реализовать это с помощью UISPlitViewcontroller, а также с masterNavigationController и detailNavigationController. Начальная фаза работает, когда представления отображаются правильно при запуске приложения, мы выбираем элемент FormTwoViewController и он помещает FormThreeViewController в detailNavigationController, а FormTwoViewController помещается в стек masterNavigationController.

У нас сейчас двойная проблема

  1. когда нажата кнопка в контроллере подробного просмотра, она ничего не делает. похоже, что обработчики отключены или что-то в этом роде.
  2. Мы не получаем кнопку в портретном режиме для отображения мастер-вида во всплывающем окне.

Есть ли у кого-нибудь примеры того, как это сделать, или любая помощь будет оценена.

1 Ответ

10 голосов
/ 25 января 2011

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after app launch.
    self.splitViewController =[[UISplitViewController alloc]init];
    self.rootViewController=[[RootViewController alloc]init];
    self.detailViewController=[[DetailViewController alloc]init];

    UINavigationController *rootNav=[[UINavigationController alloc]initWithRootViewController:rootViewController];
    UINavigationController *detailNav=[[UINavigationController alloc]initWithRootViewController:detailViewController];

    // Add the split view controller's view to the window and display.
    self.splitViewController.viewControllers=[NSArray arrayWithObjects:rootNav,detailNav,nil];
    self.splitViewController.delegate=detailViewController;
    [self.window addSubview:self.splitViewController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

где rootviewcontroller - это форма 1, а контроллер подробного вида - форма 2.

контроллер подробного представления, т. Е. Форма 2, создает переменную класса SplitViewAppDelegate * appDelegate;// id ur app делегирует свойство set переменной и синтезирует его.

, затем в форме ur два

- (void)viewDidLoad {
self.appDelegate = (SplitViewAppDelegate *)[[UIApplication sharedApplication] delegate];
}

и, наконец, нажимая форму ur три

- (IBAction)pushViewController:(id)sender{
    NSLog(@"%@",self.appDelegate.splitViewController.viewControllers);
    RootLevel1 *rootLevel1 =[[RootLevel1 alloc]init];//create form 1 root vc and assign form 1 vc
    DetailLevel1 <UISplitViewControllerDelegate>*detailLevel1=[[DetailLevel1 alloc]init];

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
                                   initWithTitle: @"Home" 
                                   style:UIBarButtonItemStylePlain 
                                   target:self 
                                   action:@selector(home)];
    rootLevel1.navigationItem.leftBarButtonItem=backButton;
    [self.appDelegate.splitViewController viewWillDisappear:YES];
    [[self.appDelegate.splitViewController.viewControllers objectAtIndex:0] pushViewController:rootLevel1 animated:YES];
    [[self.appDelegate.splitViewController.viewControllers objectAtIndex:1] pushViewController:detailLevel1 animated:YES];
    self.appDelegate.splitViewController.delegate = detailLevel1;
    [self.appDelegate.splitViewController viewWillAppear:YES];

}

идля всплывающего окна просмотра контроллера

-(void)home {
    [self.splitViewController viewWillDisappear:YES];
    [[self.appDelegate.splitViewController.viewControllers objectAtIndex:0]popViewControllerAnimated:YES];  
    [[self.appDelegate.splitViewController.viewControllers objectAtIndex:1]popViewControllerAnimated:YES];  
    UIViewController <UISplitViewControllerDelegate>*viewController=[[self.appDelegate.splitViewController.viewControllers objectAtIndex:1] visibleViewController];
    self.splitViewController.delegate=viewController;   
    [self.splitViewController viewWillAppear:YES];

}

соответственно установите Delgeate ur splitview.

...