2012-03-08 99 views
0

我已阅读故事板的following tutorialXcode(故事板和segues):为什么代表而不是引用?

基本上,本教程中创建的示例应用程序允许用户在各种视图之间导航,并且它使用segue创建。

为了视图之间进行导航教程说,创建两个的UITableViewController,当从一个到另一个“走出去”指定一个委托:

第一控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"AddPlayer"]) 
    { 
     UINavigationController *navigationController = segue.destinationViewController; 
     PlayerDetailsViewController *playerDetailsViewController = [[navigationController viewControllers] objectAtIndex:0]; 
     playerDetailsViewController.delegate = self; 
    } 
} 

第二个控制器:

@protocol PlayerDetailsViewControllerDelegate <NSObject> 

- (void)playerDetailsViewControllerDidCancel: (PlayerDetailsViewController *)controller; 
- (void)playerDetailsViewController: (PlayerDetailsViewController *)controller didAddPlayer:(Player *)player; 

@end 

@interface PlayerDetailsViewController : UITableViewController 

@property (nonatomic, weak) id <PlayerDetailsViewControllerDelegate> delegate; 

当 “回归”:

- (IBAction)cancel:(id)sender 
{ 
    [self.delegate playerDetailsViewControllerDidCancel:self]; 
} 



我的简单问题是为什么这种并发症?为什么使用代表和协议?

我改变了代码使用“Java”风格,现在我传递给第二个控制器的引用第一个,一切工作。

第一控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
... 
     playerDetailsViewController.playerViewController = self; 
} 

第二个控制器:

@property (strong, readwrite) PlayerViewController *playerViewController; 

那么,什么是使用委托的好处,而不是简单地通过ViewControllers之间的引用?

谢谢!

圭多

回答

0

放在一个Java的方式,如果你用你束缚在单一类中的强类型。 相反,委托最终是一个类符合协议。 因此,只要符合@protocol,您就可以将许多职业作为代表传递给playerDetail。

就像在java中使用接口而不是具体类来传递和传递接口。 您可能很清楚List接口和所有ArrayList,LinkedList ...等具体实现。

我不明白的一件事是为什么他们通过导航槽来获取目标控制器。我一直使用:

MyDestinationViewController *dvc = [segue destinationViewController]; 

这样,你就可以在许多情况下使用你没有导航控制器。

+0

感谢您的回答! – 2012-03-09 07:59:20

1

几个原因:

  • As Leonardo says,使用引用您耦联这两个视图控制器一起不必要的。你应该只传递需要的数据而不是整个类
  • 这就是Objective-C应用程序倾向于构建的方式。通过使用不同的方法,您可以让经验丰富的开发人员更难理解您的应用程序
  • (您并不总是需要第二类中的委托 - 例如当它仅显示时 - 因此您的示例代码更多比往往情况复杂)

与最后一点相关,你的代码已经比它需要的更难了。 UIStoryboardSegue具有指向源和目标视图控制器的属性;没有必要弄乱导航控制器。

+0

重申最后一点 - 如果目标VC嵌入在导航控制器中(而不是与当前控制器位于相同的导航堆栈中),那么你需要所有的混乱 – jrturton 2012-03-08 15:36:35

+0

@jrturton是的,你是对的。我最初误解了代码。尽管如此,所提供的代码比最常见的情况(我认为)更复杂。 – 2012-03-08 15:55:22

+0

感谢您的回答! – 2012-03-09 07:59:10