在代理之间传递数据的替代方法是什么?

“代表”是否可以将数据从一个控制器传回另一个控制器?

就像实现一个委托只是为了将一个子控制器的结果传回给父控制器一样。 有没有另一种方法? “块”是一个答案,如果是这样的话,一些示例代码会很好。

你可以使用许多方法:

  1. 调用超级控制器的方法,需要铸造也许
  2. 通知
  3. 简单的键值观察
  4. 核心数据

举例为1。

您的MainViewController的接口:为要传递的数据添加一个公共方法

- (void)newDataArrivedWithString:(NSString *)aString; 

显示ChildController的MainViewController

 - (void)showChildController { ChildController *childController = [[ChildController alloc] init]; childController.mainViewController = self; [self presentModalViewController:childController animated:YES]; [childController release]; } 

子控制器头/接口:为mainViewController添加一个属性

 @class MainViewController; @interface ChildController : UIViewController { MainViewController *mainViewController; } @property (nonatomic, retain) MainViewController *mainViewController; 

子控制器将数据传递给MainViewController

 - (void)passDataToMainViewController { NSString * someDataToPass = @"foo!"; [self.mainViewController newDataArrivedWithString:someDataToPass]; } 

代表不是很多的工作,不是很多的代码,而且通常是最合适的解决scheme。 在我看来,他们既不困难也不混乱。

孩子的界面中的五行代码 。 在@interface之前:

 @protocol MyUsefulDelegate <NSObject> - (void)infoReturned:(id)objectReturned; @end 

里面@interface:

 id <MyUsefulDelegate> muDelegate; 

@interface的@end之后:

 @property (assign) id <MyUsefulDelegate> muDelegate; 

孩子执行中的一行代码

 [[self muDelegate] infoReturned:yourReturnObject]; 

在父界面中添加一行代码

 @interface YourParentViewController : UIViewController <MyUsefulDelegate> 

父母的实施中的三行代码 。 在你给孩子打电话之前:

 [childVC setMuDelegate:self]; 

在执行的任何地方:

 - (void)infoReturned:(id)objectReturned { // Do something with the returned value here } 

总共有九行代码,其中一行代码只是对现有代码行的补充,其中一行代码是一个大括号。

这并不像从本地方法返回值那么简单,但是,一旦你习惯了这个模式,它是非常直接的,它有能力让你做各种更复杂的东西。

KVO或通知是许多情况下的方式,但是代表团有很好的基础。 如果您计划在将来扩展视图控制器之间的关系,请考虑使用委派。

块与上述不相关,但简而言之,它是iOS 4引入的一种技术,可以将代码块作为variables/parameter passing。 这是非常强大的,有很多用途。 例如,以下是如何使用块枚举数组中的对象:

 [someArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ NSLog(@"obj descriptions is - %@", [obj description]); }]; 

^}是一个块。 请注意,我已经通过它作为参数。 现在,这个代码块将被执行给数组中的每个对象(即输出将是每个对象的描述)。

块在性能方面也是非常高效的,并且在很多新的框架中被大量使用。

苹果的块初学者指南是相当不错的。

查看NSNotificationCenter – NSNotificationCenter类参考

在MVC中,人们非常关注V和C,但经常忘记M.如果你有一个数据模型,你可以从一个控制器传递给下一个控制器。 当一个控制器对存储在模型中的数据进行更改时,共享相同模型的所有其他控制器将自动获取更改。

你可能会发现使用单例是可行的。 只需将其用作所有共享数据的中央存储。

然后抛出保存你的应用程序的状态;)