为什么这段代码使用presentModalViewController?(不是pushViewController)

Gre*_*reg 4 iphone uiviewcontroller uinavigationcontroller modalviewcontroller ios

任何人都明白为什么在CoreDataBooks示例代码中:

(a)控制器交换差异的方法

虽然单击一个项目并转到详细视图使用了似乎是" pushViewController " 的标准UINavigationController概念,但当您单击"添加"新记录按钮时,它会启动新视图以通过" presentModalViewController "添加记录"接近?也就是说,这两种方法都不一样,只是使用pushViewController方法?

使用每种方法实际上是否有任何优势?我不太明白.我猜想苹果必须为不同的场景选择不同的方法.例如:

  1. 他们会看到与用户的任何差异(即UI差异或功能差异)?

  2. 开发人员的任何差异(或优点/缺点)

例如,如果你要考虑使用pushViewController方法,而不是针对的presentModalViewController方法为"添加"的情景......

(b)数据共享方法的差异

他们如何共享共同数据对象的方法似乎有所不同 - 所以再次只是想知道为什么这些方法不一样?(即在两种情况下,主控制器暂时传递到另一个视图,并且它们之间存在一些共享数据 - 即子视图需要传递回父级)

代码提取便利性

这是为了"编辑":

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Create and push a detail view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    Book *selectedBook = (Book *)[[self fetchedResultsController] objectAtIndexPath:indexPath];

    // Pass the selected book to the new view controller.
    detailViewController.book = selectedBook;
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}
Run Code Online (Sandbox Code Playgroud)

但是对于"添加"

- (IBAction)addBook {
    AddViewController *addViewController = [[AddViewController alloc] initWithStyle:UITableViewStyleGrouped];
     addViewController.delegate = self;

     // Create a new managed object context for the new book -- set its persistent store coordinator to the same as that from the fetched results controller's context.
     NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
     self.addingManagedObjectContext = addingContext;
     [addingContext release];

     [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
     addViewController.book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:addingContext];
     UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController];
        [self.navigationController presentModalViewController:navController animated:YES];

     [addViewController release];
     [navController release];

}
Run Code Online (Sandbox Code Playgroud)

谢谢

DVG*_*DVG 9

您可以使用模态视图控制器将用户的注意力集中在任务上.当您推送时,用户处于某种导航流程中,但仍然可以轻松获得总应用程序.他们可能决定前进或后退,切换到中间的不同选项卡,无论如何.当他们得到一个模态视图控制器时,他们不能做任何这个,直到任务完成或取消(模态视图被解除)