【问题标题】:iPad SplitViewController Recursive Drill Down - Access DetailViewControlleriPad SplitViewController 递归向下钻取 - 访问 DetailViewController
【发布时间】:2011-11-01 07:39:06
【问题描述】:

我采用了一个基于标准 iPad SplitViewerController 模板的项目,并实现了递归向下导航到任意数量的级别,如下所示:

首先,我创建了一个新的视图控制器(名为 NavItemController),我将其弹出到 RootViewController 的 didSelectRowAtIndexPath 方法中的控制器堆栈中,如下所示:

NavItemController  *navItemController = [[NavItemController alloc] initWithNibName:@"NavItemController" bundle:[NSBundle mainBundle]];
navItemController.title = catalogue.name;
[[self navigationController] pushViewController:navItemController animated:YES];

然后,我使用这个视图控制器进行所有上下导航我的树结构(因此 RootViewController 现在仅用于显示导航的初始根级别,即没有父项的项目)。

一切都很好。

现在,当我在 NavItemController 中选择一个项目时,我正在尝试更新详细视图 (detailViewDescriptionLabel) 上的标签。为此,我首先在我的 NavItemController 中添加了一个出口:

@property (nonatomic, strong) IBOutlet DetailViewController *detailViewController;

并在 InterfaceBuilder 中配置它,方法是将库中的视图控制器添加到 Objects 列表中,将其类更改为 DetailViewController 并连接我在 File's Owner 下找到的插座。

此时,如果我单步执行我的代码,我发现它正确地将我的详细视图中的 detailItem 设置为在我的 NavController 中选择的对象 - 并且它似乎正确地将 detailDescriptionLabel.text 值设置为来自此 detailItem 的值。但是,这并没有反映在 UI 中(如果我从 RootViewController 执行此操作,它仍然有效)。

我猜我没有正确连接某些东西或在某处错过了一步 - 我(显然)对 iOS 很陌生 - 任何指针都将不胜感激。

【问题讨论】:

    标签: ios ipad uisplitviewcontroller


    【解决方案1】:

    我最终通过使用 iOS 5 和 Master Detail 模板从头开始创建我的项目来解决我的问题。我还选择使用故事板功能。

    我能够使用 MasterViewController(与早期模板中的 RootViewController 相同)进行递归导航,即我不需要创建单独的视图控制器。

    MasterViewController didSelectRowAtIndexPath 方法中的代码最终变成:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
        self.detailViewController.detailItem = selectedObject; 
    
        NavItem *navItem = ((NavItem *) selectedObject);
        Catalogue *catalogue = nil;
        Document *document = nil;
    
        if (navItem.catalogue != nil) // Load child catalogues and documents
        {
            catalogue = [navItem catalogue];
            DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
            [dataLoader drillDownIntoNavItems:catalogue];
            UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
            MasterViewController  *controller = [storyBoard instantiateViewControllerWithIdentifier:@"master"];
            controller.managedObjectContext = self.managedObjectContext;
            controller.title = catalogue.name;
    
            [[self navigationController] pushViewController:controller animated:YES];
        } 
        else if (navItem.document != nil) // Load attachments
        {
            document = [navItem document];
            DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
            [dataLoader drillDownIntoNavItems:document];
            UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
            MasterViewController  *controller = [storyBoard instantiateViewControllerWithIdentifier:@"master"];
            controller.managedObjectContext = self.managedObjectContext;
            controller.title = document.name;
            [[self navigationController] pushViewController:controller animated:YES];
    
            // Display document in detail viewer
        }
    
        else // attachment
        {
            // Display attachment in popover
        }
    }
    

    MasterViewController 中的 viewWillDisappear 方法也很重要:

    - (void)viewWillDisappear:(BOOL)animated
    {
        if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
            // back button was pressed. We know this is true because self is no longer
            // in the navigation stack. 
            DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
            [dataLoader drillUpIntoNavItems];
        }
    
        [super viewWillDisappear:animated];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多