2016-02-02 138 views
0

我正在使用分割视图控制器,并在使用新视图控制器替换我的详细视图控制器时出现问题。当我启动应用程序时,我将我的空视图控制器作为我的详细视图控制器,并点击导航栏上的按钮以显示主视图控制器。当我在主视图控制器中选择一行时,我的详细视图控制器将被替换为相应的控制器。在你第一次选择一行时它可以正常工作,但是之后每次从主控制器中选择一行时,主控制器都不会消失,因此它只停留在细节控制器之上。替换详细视图控制器

的AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    // Override point for customization after application launch. 

    MasterViewController *masterVC = [[MasterViewController alloc]initWithNibName:@"MasterViewController" bundle:nil]; 
    UINavigationController *masterNavController = [[UINavigationController alloc]initWithRootViewController:masterVC]; 

    DetailViewController *detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil]; 
    UINavigationController *detailNavController = [[UINavigationController alloc]initWithRootViewController:detailVC]; 

    masterVC.detailViewController = detailVC; 

    self.splitViewController = [[UISplitViewController alloc]init]; 
    self.splitViewController.delegate = detailVC; 
    self.splitViewController.viewControllers = @[masterNavController, detailNavController]; 

    self.window.rootViewController = self.splitViewController; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

MasterViewController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    ActionAlertsViewController *rootView = [[ActionAlertsViewController alloc]initWithNibName:nil bundle:nil]; 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 
    NSMutableArray *details = [self.splitViewController.viewControllers mutableCopy]; 

    if (indexPath.section == 0) { 
     if (indexPath.row == 0) { 
      rootView.title = @"Action Alerts"; 
      rootView.background = [UIImage imageNamed:@"capitol"]; 
      rootView.urlString = @"http://kyfbnewsroom.com/category/public-affairs/notifications/feed/"; 
      [rootView fetchEntries]; 

      UINavigationController *detailNav = [[UINavigationController alloc]initWithRootViewController:rootView]; 

      if (details.count > 1) { 
       [details replaceObjectAtIndex:1 withObject:detailNav]; 
      } else { 
       [details insertObject:detailNav atIndex:1]; 
      } 

      appDelegate.splitViewController.viewControllers = details; 
      appDelegate.window.rootViewController = self.splitViewController; 
      appDelegate.splitViewController.delegate = rootView; 
      [appDelegate.splitViewController viewWillAppear:YES]; 
     } 
    } 
} 
+2

你不应该调用viewWillAppear中这是一个由系统调用的视图控制器生命周期方法。你应该说[self.splitViewController showDetailViewController:detailNav sender:self]; – beyowulf

+0

[self.splitViewController.viewControllers mutableCopy]? (a)不要以这种方式创建/复制视图控制器。 (b)故事板? – SwiftArchitect

回答

1

我不知道从哪里开始:

  1. 不要复制/克隆UIViewControllers[self.splitViewController.viewControllers mutableCopy]
  2. 唐不会调用系统启动的我ssages:[appDelegate.splitViewController viewWillAppear:YES]
  3. 不要复位根视图控制器” appDelegate.window.rootViewController
  4. 不要回去AppDelegate找出哪些查看您是
  5. @beyowulf注意:你不应该调用viewWillAppear即系统调用的视图控制器生命周期方法。你应该这样说:[self.splitViewController showDetailViewController:detailNav sender:self]

务必阅读documentation并按照教程:

相关问题