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

Gre*_*reg 1 iphone delegates objective-c ios objective-c-blocks

是否有"代表"的替代方案可以将数据从一个控制器传回另一个控制器?

看起来很多工作只是为了将子控制器的结果传回父控制器而实现委托.没有其他方法吗?"块"是一个答案,如果是这样,一些示例代码将是伟大的.

Mat*_*ick 14

代表不是很多工作,代码不是很多,而且通常是最合适的解决方案.在我看来,它们既不困难也不凌乱.

子界面中有五行代码.在@interface之前:

@protocol MyUsefulDelegate <NSObject>
- (void)infoReturned:(id)objectReturned;
@end
Run Code Online (Sandbox Code Playgroud)

内部@interface:

id <MyUsefulDelegate> muDelegate;
Run Code Online (Sandbox Code Playgroud)

在@inteface的@end之后:

@property (assign) id <MyUsefulDelegate> muDelegate;
Run Code Online (Sandbox Code Playgroud)

孩子实现中的一行代码:

[[self muDelegate] infoReturned:yourReturnObject];
Run Code Online (Sandbox Code Playgroud)

父对象中现有代码行的一个补充:

@interface YourParentViewController : UIViewController <MyUsefulDelegate>
Run Code Online (Sandbox Code Playgroud)

父实现中的三行代码.在给孩子打电话之前的某个地方:

[childVC setMuDelegate:self];
Run Code Online (Sandbox Code Playgroud)

实施中的任何地方:

- (void)infoReturned:(id)objectReturned {
    // Do something with the returned value here
}
Run Code Online (Sandbox Code Playgroud)

总共九行代码,其中一行仅仅是对现有代码行的补充,其中一行是结束大括号.

它并不像从本地方法中返回一个值那么简单,但是一旦你习惯了这个模式,它就会非常简单,并且它有能力让你做各种更复杂的事情.


Nic*_*ver 7

你可以用很多方法:

  1. 调用超级控制器的方法,可能需要进行转换
  2. 通知
  3. 简单的键值观察
  4. 核心数据

1的示例.

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

- (void)newDataArrivedWithString:(NSString *)aString;
Run Code Online (Sandbox Code Playgroud)

显示ChildController的MainViewController

- (void)showChildController
{
    ChildController *childController = [[ChildController alloc] init];
    childController.mainViewController = self;

    [self presentModalViewController:childController animated:YES];

    [childController release];
}
Run Code Online (Sandbox Code Playgroud)

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

@class MainViewController;

@interface ChildController : UIViewController {
    MainViewController *mainViewController;   
}

@property (nonatomic, retain) MainViewController *mainViewController;
Run Code Online (Sandbox Code Playgroud)

子控制器将数据传递给MainViewController

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