Rob*_*egg 4 iphone objective-c ios objective-c-blocks
我在看这个问题.
其中一个答案显示了如何使用块向后传递数据查看prepareForSegue方法.我的理解是这种方法应该用于向前传递数据,而不是向后传递数据.
我想为此目的尝试阻塞 - 将数据传递回另一个viewController.
我的问题是:如何在不使用prepareForSegue方法的情况下执行此操作?我可以在例如UITableView中使用 - didselectRowAtIndexPath并且忽略视图 - 但接收视图如何被"通知"有数据返回,而不使用委托?
Anu*_*uni 10
向后发送数据
block在你的secondViewController.h文件中声明
@property (nonatomic, copy)void(^myBlock)(NSString *);
调用块,无论你需要从.m文件传递数据 secondViewController
myBlock(@"this will displayed in firstViewController");
3. .h在您的firstViewController .m文件中导入上面的文件并定义您的blockas
secondViewController *ref =[[secondViewController alloc ]init];
ref.myBlock =^void(NSString *data)
{
self.labelOffirstviewcontroller=data;
};
Run Code Online (Sandbox Code Playgroud)
在您的视图控制器 1 中:
MyViewControllerClass2* vc2 = [[MyViewControllerClass2 alloc] initWithNibName:@"UIViewController" bundle:[NSBundle mainBundle] completion:^{
NSLog(@"view2 is closed");
}]];
[self.navigationController pushViewController:vc2 animated:YES];
Run Code Online (Sandbox Code Playgroud)
在 MyViewControllerClass2.m 中:
@interface MarryViewController ()
@property (nonatomic, copy) void(^completion)();
@end
@implementation MarryViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil completion:(void(^)())completion
{
self = [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if( self )
{
//store completion block
_completion = completion;
}
return self;
}
-(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
//call completion block
_completion();
}
Run Code Online (Sandbox Code Playgroud)
在 MyViewControllerClass2.h 中:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil completion:(void(^)())completion;
Run Code Online (Sandbox Code Playgroud)
关于区块有多棒的几点说明:
MyViewControllerClass2 不知道 _completion() 中定义了什么,这是重点,因为这不是他关心的
您还可以在 -dealloc 中甚至在 MyViewControllerClass2 将继续运行的某个地方调用 _completion()
您可以将参数传递给块函数
您可以从块函数传递参数
还有很多 :)
我真的鼓励人们对使用它们的块和统计数据有很好的了解,因为它们非常酷。
重要的!
使用块时不声明委托,委托方法和使用块的主要思想和抽象结果是相同的。此外,委托模式具有更好的文档记录和更严格的使用等优点。Still 块更灵活并且(习惯时)更易于使用。
问候,
克里斯托
| 归档时间: |
|
| 查看次数: |
4336 次 |
| 最近记录: |