2010-10-08 9 views
4

Je suis en train de créer une application iPad avec une interface utilisateur similaire à l'application Mail d'Apple, à savoir:Mise à jour DetailViewController de RootController

  • contrôleur RootView (vue de table) sur le côté gauche de la vue fendue pour navigation avec une hiérarchie de vues multiples. Lorsqu'une cellule de tableau est sélectionnée, une nouvelle vue de table est poussée sur le côté gauche
  • La nouvelle vue sur le côté gauche peut mettre à jour la vue détaillée.

Je peux accomplir les deux tâches MAIS PAS ENSEMBLE. Je veux dire que je peux faire une vue de table à plusieurs niveaux dans le RootController (HERE you can find the working source code).

Ou je peux faire une vue de table à un seul niveau dans le RootController qui peut mettre à jour le detailViewController (ici il y a le code source: http: //www.megaupload.com/? D = D6L0463G).

Quelqu'un peut-il me dire comment faire une table à plusieurs niveaux dans le RootController qui peut mettre à jour un detailViewController?

Il y a plus de code source au lien, mais ci-dessous est la méthode dans laquelle je suppose que je dois déclarer une nouvelle detailViewController (qui doit être mis en 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]; 
    } 
} 
+8

Bienvenue dans Stack Overflow (SO). Un certain nombre de choses. D'abord, vous pouvez mettre en forme le code en le mettant en retrait de quatre espaces. Je vais le faire pour vous juste après avoir terminé ce commentaire. Deuxièmement, les gens sur SO qui vont vous aider ne sont pas du tout "paresseux" mais ils sont probablement occupés. L'affichage de votre code source afin que les gens puissent vous aider avec leur temps limité est généralement attendu. – John

Répondre

0

Désolé, mais je Impossible de publier mon code source car il contient des informations sensibles. Quand j'ai plus de temps disponible, je vais créer un projet séparé et télécharger le code quelque part.

Voici des extraits de comment je l'ai fait jusqu'à présent (je me félicite de tout commentaire).

Le RootViewController - Note J'ai 4 sections dans ma table racine.

#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 partie

Ajouter à ce 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]; 
} 

Enfin, ajoutez à 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"]; 
} 

J'espère que ça aide!

+0

Merci pour votre temps, enfin je comprends comment NSNotification fonctionne! – metronic