2014-02-07 53 views
1

我目前有一個UISplitViewController。我在主視圖控制器中有5行,並且每次點擊時都會將其各自的詳細視圖放在屏幕上。它基本上像某種菜單一樣工作。UISplitView - 如果有一個實例已經可見,如何防止加載詳細視圖的新實例?

我編碼它的方式是在didSelectRow:方法中。

下面是一個示例代碼

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     if([indexPath row] == 0) 
     { 
      firstviewcontroller = [self.storyboard instantiateViewControllerWithIdentifier:@"firstviewcontroller"]; 

      UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:firstviewcontroller]; 

      NSArray *vcs = [NSArray arrayWithObjects:[self navigationController], nvc, nil]; 

      [[self splitViewController] setViewControllers:vcs]; 

      [[self splitViewController] setDelegate:firstviewcontroller]; 

它基本上是對其他4行我也一樣。

現在,例如,如果第一行被點擊,它將顯示第一個控制器。當第一行再次點擊時,它將用新實例替換當前實例。

我該如何預防?當我在第一個視圖控制器中填寫細節時(例如textfields等),然後我意外地敲擊第一行,它取代當前實例並且所有文本域都是空的並且需要再次填寫時,真的很煩人。

我也想問問如何保留viewcontroller實例。例如,我填寫了第一個視圖控制器所需的數據,然後點擊第二行顯示第二個視圖控制器。當我再次點擊第一行時,我想讓我已經完成填充數據的第一個控制器的實例。(有點像Settings應用程序的工作方式)

回答

2

你應該做的是保持對菜單控制器中的內容視圖控制器的強引用作爲屬性。

@private (nonatomic, strong) UINavigationController *navController1; 
@private (nonatomic, strong) UINavigationController *navController2; 
.... 

然後

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([indexPath row] == 0) 
    { 
     if (!self.navController1) { 
      UIViewController *firstviewcontroller = [self.storyboard instantiateViewControllerWithIdentifier:@"firstviewcontroller"]; 
      self.navController1 = [[UINavigationController alloc] initWithRootViewController:firstviewcontroller]; 
     } 
     if ([self splitViewController] viewControllers] lastObject] != self.navController1) { 
      NSArray *vcs = [NSArray arrayWithObjects:[self navigationController], self.navController1, nil]; 
      [[self splitViewController] setViewControllers:vcs]; 
      [[self splitViewController] setDelegate:self.navController1.rootViewController]; 
     } 
    } 
} 

這樣,每次他們將不會重新創建你的狀態被保留。

+0

是的,他說的。 – NovaJoe

+0

感謝您的回答。這個對我有用。如果已經有一個,它不會創建詳細視圖的新實例,並且當我轉到另一個我想要的詳細視圖時,它會保留當前值。 – aresz

+0

@NovaJoe不同之處在於,我的代碼將保留推送到splitViewController的任何視圖控制器的狀態,其中他唯一的狀態將保留當前狀態,然後僅當您不選擇顯示不同的狀態控制器。 – jamone

1

您可以檢查當前的類顯示的細節視圖控制器對你期望在那裏的類。

if([self.splitViewcontroller.viewControllers.lastObject isKindOfClass:[FirstDetailViewController class]]) 
{ 
    //Here you know that the current detail view controller is of the kind of the first master row... 
    [self.splitViewcontroller.viewControllers.lastObject.navigationController popToRootViewControllerAnimated:YES]; //You don't have to do this, just an example. 
} 
else 
{ 
    //Initialize normally 
} 
相關問題