在控制器之间传递数据的“委托”的替代方法是什么?

时间:2011-04-03 21:00:14

标签: iphone objective-c ios delegates objective-c-blocks

“委托”是否有替代方案可以将数据从一个控制器传回另一个控制器?

似乎很多工作实现委托只是为了将子控制器的结果传回给父控制器。没有其他方法吗? “块”是一个答案,如果是这样,一些示例代码就会很棒。

6 个答案:

答案 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. 调用超级控制器的方法,需要强制转换
  2. Notifications
  3. 简单Key-Value-Observing
  4. Core Data
  5. 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)

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

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