从RootController更新DetailViewController

时间:2010-10-08 16:01:09

标签: ipad uitableview uisplitviewcontroller

我正在尝试使用与Apple的Mail应用程序类似的用户界面创建一个iPad应用程序,即:

  • 分割视图左侧的RootView控制器(表视图),用于具有多视图层次结构的导航。选择表格单元格时,左侧会按下新的表格视图
  • 左侧的新视图可以更新详细视图。

我可以完成这两项任务但不能完成任务。 我的意思是我可以在RootController中创建一个多级表视图。(HERE you can find the working source code)。

或者我可以在RootController中创建一个可以更新detailViewController的单级表视图(这里有源代码:http://www.megaupload.com/?d = D6L0463G)。

有谁能告诉我如何在RootController中创建一个可以更新detailViewController的多级表?

链接上有更多源代码,但下面是我假设我必须声明一个新的detailViewController(必须放在UISplitViewController中)的方法:

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

NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];

//Get the children of the present item.
NSArray *Children = [dictionary objectForKey:@"Children"];

//
if([Children count] == 0) {
    /*
    Create and configure a new detail view controller appropriate for the selection.
    */
    NSUInteger row = indexPath.row;
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil;

    if (row == 0) {
        FirstDetailViewController *newDetailViewController = [[FirstDetailViewController alloc]initWithNibName:@"FirstDetailView" bundle:nil];
        detailViewController = newDetailViewController;
    }

    if (row == 1) {
        SecondDetailViewController *newDetailViewController = [[SecondDetailViewController alloc]initWithNibName:@"SecondDetailView" bundle:nil];
        detailViewController = newDetailViewController;
    }

    // Update the split view controller's view controllers array.
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers//nothing happens.....
    [viewControllers release];// 
}

else {

    //Prepare to tableview.
    RootViewController *rvController = [[RootViewController alloc]initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle]];

    //Increment the Current View
    rvController.current_level += 1;

    //Set the title;
    rvController.current_title = [dictionary objectForKey:@"Title"];

    //Push the new table view on the stack
    [self.navigationController pushViewController:rvController animated:YES];

    rvController.tableDataSource = Children;
    [rvController.tableView reloadData]; //without this instrucion,items won't be loaded inside the second level of the table 

    [rvController release];
    }
}

1 个答案:

答案 0 :(得分:0)

抱歉,我无法发布源代码,因为它包含敏感信息。当我有更多时间可用时,我将创建一个单独的项目并在某处上传代码。

以下是迄今为止我如何做到的摘录(我欢迎任何反馈)。

RootViewController - 注意我的根表中有4个部分。

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    // Detail view logic
    NSUInteger section = indexPath.section;
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil;

    if (section == 2) {
        ProductSearchDetailView *viewController = [[ProductSearchDetailView alloc] initWithNibName:@"ProductSearchDetailView" bundle:nil];
        detailViewController = viewController;
        //[viewController release];
    }
    else {
        DetailViewController *defaultDetailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
        detailViewController = defaultDetailViewController;
        //[defaultDetailViewController release];
    }

    // Navigation logic 
    switch (section) {
        case 0: 
        {
            break;
        }
        case 1:
        {
            break;
        }
        case 2:
        {
            // new Navigation view
            ProductSearchViewController *viewController = [[ProductSearchViewController alloc] initWithNibName:@"ProductSearchViewController" bundle:nil];
            viewController.navigationItem.backBarButtonItem.title = @"Back";
            [self.navigationController pushViewController:viewController animated:YES];
            [viewController release];

            break;  
        }
        case 3:
        {
            StoreLocatorNavController *viewController = [[StoreLocatorNavController alloc] initWithNibName:@"StoreLocatorNavController" bundle:nil];
            viewController.navigationItem.backBarButtonItem.title = @"Back";
            [self.navigationController pushViewController:viewController animated:YES];
            [viewController release];
            break;
        }   
    }

    // Update the split view controller's view controllers array.
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;
    [viewControllers release];

    // Dismiss the popover if it's present.
    if (popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    }

    // Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created).
    if (rootPopoverButtonItem != nil) {
        [detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
    }

    [detailViewController release];

}

NSNotificationCenter部分

将此添加到ProductSearchViewController:

#pragma mark -
#pragma mark Table view delegate

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

    NSDictionary *itemAtIndex = (NSDictionary *)[self.productResults objectAtIndex:indexPath.row];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"updateProduct" object:itemAtIndex];
}

最后,将其添加到ProductSearchDetailViewController:

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTheProductDetails:) name:@"updateProduct" object:nil];

}

- (void)updateTheProductDetails:(NSNotification *)notification {
NSDictionary *productDictionary = [NSDictionary dictionaryWithDictionary:[notification object]];

    // product name
    _productName.text = [productDictionary objectForKey:@"ProductDescription"];
}

希望它有所帮助!