“委托”是否有替代方案可以将数据从一个控制器传回另一个控制器?
似乎很多工作实现委托只是为了将子控制器的结果传回给父控制器。没有其他方法吗? “块”是一个答案,如果是这样,一些示例代码就会很棒。
答案 0 :(得分:14)
代表不是很多工作,代码不是很多,而且通常是最合适的解决方案。在我看来,它们既不困难也不凌乱。
子项界面中的五行代码。在@interface之前:
@protocol MyUsefulDelegate <NSObject>
- (void)infoReturned:(id)objectReturned;
@end
内部@interface:
id <MyUsefulDelegate> muDelegate;
在@inteface的@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
}
共有九行代码,其中一行只是对现有代码行的补充,其中一行是结束大括号。
它并不像从本地方法中返回一个值那么简单,但是一旦你习惯了这个模式,它就会非常简单,并且它有能力让你做各种更复杂的事情。 / p>
答案 1 :(得分:7)
您可以使用多种方式:
1的示例
MainViewController的接口:为要传递的数据添加公共方法
- (void)newDataArrivedWithString:(NSString *)aString;
MainViewController显示ChildController
- (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];
}
答案 2 :(得分:2)
KVO或通知是许多情况下的方法,但是委托给予了很好的基础。如果您计划在将来扩展视图控制器之间的关系,请考虑使用委派。
块与上面的内容并不相关,但简而言之 - 它是iOS 4引入的一种技术,您可以将代码块作为变量/参数传递。它非常强大,有很多用途。例如,以下是使用块枚举数组中对象的方法:
[someArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
NSLog(@"obj descriptions is - %@", [obj description]);
}];
从^
到}
的部分是一个块。请注意,我已将其作为参数传递给它。现在,将对阵列中的每个对象执行这段代码(即输出将是每个对象的描述)。
块在性能方面也非常有效,并且在许多新框架中被大量使用。
Apple的blocks beginners guide非常好。
答案 3 :(得分:1)
结帐NSNotificationCenter
- NSNotificationCenter Class Reference
答案 4 :(得分:1)
人们非常关注MVC中的V和C,但经常忘记M.如果你有一个数据模型,你可以将它从一个控制器传递给下一个控制器。当一个控制器对存储在模型中的数据进行更改时,共享相同模型的所有其他控制器将自动获得更改。
答案 5 :(得分:0)
您可能会发现使用单身是实用的。只需将其用作所有共享数据的中央存储。
然后抛出保存应用程序的状态;)