1

嗯,可能不清楚标题。我已经从Apple的MultipleDetailView示例代码中取出了这个。每次用户从弹出式表格中选择一行时,detailViewController都会再次分配FirstDetailViewController和SecondDetailViewController。我不想一遍又一遍地分配和初始化视图控制器,我想要分配现有的已经分配和初始化的视图控制器(如果存在于选择该行的detailViewController上)。我修改了分割视图模板而不是示例代码来实现我所需要的。从程序代码:需要UISplitViewController延迟加载多个视图控制器的详细视图控制器

这是AppDelegate.h文件:

@interface iPadHelloWorldAppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 

    UISplitViewController *splitViewController; 

    MasterViewController *masterViewController; 
    DetailViewController *detailViewController; 
    SecondDetailViewController *secondDetailViewController; 
} 

这是AppDelegate.m文件:

masterViewController = [[MasterViewController alloc] init]; 
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController]; 
detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil]; 
secondDetailViewController = [[SecondDetailViewController alloc] initWithNibName:@"SecondDetailView" bundle:nil]; 
splitViewController = [[UISplitViewController alloc] init]; 
splitViewController.viewControllers = [NSArray arrayWithObjects:navigationController, detailViewController, nil]; 
    splitViewController.delegate = detailViewController; 
    // Add the split view controller's view to the window and display. 
    [window addSubview:splitViewController.view]; 
    [window makeKeyAndVisible]; 

这是MasterViewController.m:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = indexPath.row; 
    [self.appDelegate.splitViewController viewWillDisappear:YES]; 
    self.tempArrays = [NSMutableArray arrayWithArray:self.appDelegate.splitViewController.viewControllers]; 
    [self.tempArrays removeLastObject]; 
    if (row == 0) { 
     [self.tempArrays addObject:self.appDelegate.detailViewController]; 
     self.appDelegate.splitViewController.delegate = self.appDelegate.detailViewController; 
    } 
    if (row == 1) { 
     [self.tempArrays addObject:self.appDelegate.secondDetailViewController]; 
     self.appDelegate.splitViewController.delegate = self.appDelegate.secondDetailViewController; 
    } 
    self.appDelegate.splitViewController.viewControllers = self.tempArrays; 
    [self.appDelegate.splitViewController viewWillAppear:YES]; 
} 

这是DetailViewController.m:

#pragma mark - 
#pragma mark Split view support 

- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc { 

    barButtonItem.title = @"Master List"; 
    [navigationBar.topItem setLeftBarButtonItem:barButtonItem animated:NO]; 
    self.popoverController = pc; 
} 

// Called when the view is shown again in the split view, invalidating the button and popover controller. 
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { 

    [navigationBar.topItem setLeftBarButtonItem:nil animated:NO]; 
    self.popoverController = nil; 
} 

我能够延迟加载视图控制器,但是当我点击弹出栏的按钮并跳转到第二个视图控制器时,第二个视图控制器不显示弹出窗口。当我跳回到第一个详细视图控制器时,会显示弹出窗口。

基本上,here是一个类似的问题。但是到那里的下拉框的链接不起作用。

回答

3

既然你问我有出手 - 在这里不言而喻。 SplitViewController比较麻烦,从我们这里看来。如果您不坚持Apple在示例代码中的操作方式,我们遇到了很多问题。

首先,我建议你再次拿起示例代码,并从头开始,因为它似乎你已经修改了很多。

至于你的问题:在你的委托和MainWindow.xib你设置你的SplitViewController。最重要的是不要像你这样设置viewControllers数组。

我遇到了这个问题,如果我覆盖RootViewController,它会搅乱SplitViewController并产生像你遇到的错误。

尝试设置您的RootViewController(TableViewController)只有一次,永远不会覆盖它在viewControllers属性。不过,这对于DetailViewController来说似乎没问题。其次,你的代码应该放在其他地方,而不是放在RootViewController中。这应该只适用于tableView数据源和内容。

试试这个,并在这里反馈,我会尽快跟进。

祝你好运。

编辑:代码追加 - 在你的RootViewController的做到这一点:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
// Navigation logic may go here. Create and push another view controller. 

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 


DetailViewController *dvC = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 

// take the original view controller from the splitviewcontroller as root 
// appDelegateiPad defined like this in my appdelegate: 
// #define appDelegateiPad ((AppDelegate_iPad *)[[UIApplication sharedApplication] delegate]) 
NSArray *viewControllers = [[NSArray alloc] initWithObjects:[[appDelegateiPad.splitViewController viewControllers]objectAtIndex:0], dvC, nil]; 
     appDelegateiPad.splitViewController.viewControllers = viewControllers; 
//careful with this, set it to whatever your delegate is in your case   
appDelegateiPad.splitViewController.delegate = dvC; 
     [viewControllers release]; 


//this is my version 
//i have the popoverController property in my detailviewcontroller. this is where my splitviewcontroller delegate methods are. you need to set the popovercontroller property in the class where your splitviewcontroller delegate methos are 
    dvC.popoverController = [[[appDelegateiPad.splitViewController viewControllers]objectAtIndex:1] popoverController];  

    } 
} 
0

尝试在此对象的viewDidLoad中分配viewControllers。给这两个viewcontrollers一个标题,并把它们放入一个数组中。如果需要,这些标题可以用于两个单元格的文本标签。 在didSelectRowAtIndexPath方法,你可以得到正确的ViewController对于选择的行

UIViewController <SubstitutableDetailViewController> *detailViewController = [theArray objectAtIndex:indexPath.row]; 

编辑:

@interface SomeClass : NSObject { 
    NSArray *controllerArray; 
} 
@end 
@implementation SomeClass 

- (void) viewDidLoad { 
    controllerArray = [[NSArray alloc] initWithObject://yourControllers//,nil]; 
    [super viewDidLoad] 
} 

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { 

    // Two sections, one for each detail view controller. 
    return 2; 
} 

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    //Create Cell 

    UIViewCOntroller *controller = [controllerArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = controller.title; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [detailViewController autorelease]; 
    detailViewController = [[controllerArray objectAtIndex:indexPath.row] retain]; 
} 

@end 
+0

嘿谢谢你的回复。请检查编辑。 – Viraj 2011-02-16 09:23:35

+0

这是一个解决方案(延迟加载)。但是每当你选择一行时,就执行一条if语句。不足够。查看我的编辑,了解我将选择的解决方案。 – 2011-02-16 09:48:37

0

这是没有必要创建详细信息视图控制器的新实例或更新拆分视图控制器viewControllers。

试试这个。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

     UIApplication *application = [UIApplication sharedApplication]; 
     AppDelegate *appDelegate = (AppDelegate*) [application delegate]; 
     appDelegate.detailViewController.label.text = @"Detail view controller updated"; 

    } 

PS:请将标签拖动到详细信息进行测试。

相关问题