我在看this question。
其中一个答案显示了如何使用块向后传递数据查看prepareForSegue
方法。我的理解是这种方法应该用于向前传递数据,而不是向后传递数据。
我想为此目的尝试阻止 - 将数据传递回另一个viewController。
我的问题是:如何在不使用prepareForSegue
方法的情况下执行此操作?
我可以在UITableView中使用 - didselectRowAtIndexPath
并关闭视图 - 但接收视图如何“通知”有数据返回,而不使用委托?
答案 0 :(得分:10)
向后发送数据
在 block
文件中声明secondViewController.h
@property (nonatomic, copy)void(^myBlock)(NSString *);
在需要从 secondViewController
的.m文件传递数据的地方调用阻止
myBlock(@"this will displayed in firstViewController");
3.导入.h
firstViewController
文件中.m
以上的文件
并将您的block
定义为
secondViewController *ref =[[secondViewController alloc ]init];
ref.myBlock =^void(NSString *data)
{
self.labelOffirstviewcontroller=data;
};
答案 1 :(得分:4)
在视图控制器1中:
MyViewControllerClass2* vc2 = [[MyViewControllerClass2 alloc] initWithNibName:@"UIViewController" bundle:[NSBundle mainBundle] completion:^{
NSLog(@"view2 is closed");
}]];
[self.navigationController pushViewController:vc2 animated:YES];
在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();
}
在MyViewControllerClass2.h中:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil completion:(void(^)())completion;
关于如何棒块的几点说明:
MyViewControllerClass2不知道在_completion()中定义了什么是主要观点,因为这不是他关心的问题
您也可以在-dealloc中调用_completion(),甚至在MyViewControllerClass2将继续运行的某个地方调用
您可以将参数传递给块函数
您可以从块函数传递参数
更多:)
我真的很鼓励人们使用它们很好地了解块和stat,因为它们非常酷。
重要!强>
使用块时你没有声明委托,委托方法和使用块的主要思想和抽象结果是相同的。委托模式具有更好的记录和更严格的使用等优点。静止块更灵活,(当习惯时)更容易使用。
此致
hris.to
答案 2 :(得分:3)
我知道您专门询问了不涉及prepareForSegue
的解决方案,但这似乎是基于prepareForSegue
仅用于传递数据的假设。
有一种叫做放松的东西可能会对你的情况有所帮助。有关SO here的详细讨论。
如果您特别想要使用块,则可以简单地将块属性添加到子控制器并让父控制器设置块。子控制器在被解除时必须调用该块。如果你这样做,请注意保留循环。对我来说听起来不像块是这种情况下的最佳解决方案,但是如果没有更多的上下文,很难用权威来说这样的话。
答案 3 :(得分:0)
是的方法可以向前和向后发送数据,因为您可以使用Blocks
或Delegates
有关ios中块的更多信息,请使用此链接
CLICK HERE
希望它能帮助你,thnx