Ios 使用块将数据传回视图控制器
我在看 其中一个答案显示了如何使用块向后传递数据查看Ios 使用块将数据传回视图控制器,ios,iphone,objective-c,objective-c-blocks,Ios,Iphone,Objective C,Objective C Blocks,我在看 其中一个答案显示了如何使用块向后传递数据查看prepareforsgue方法。我的理解是,这种方法应该真正用于向前传递数据,而不是向后传递数据 为此,我想尝试使用块—将数据传递回另一个viewController 我的问题是:如何在不使用prepareForSegue方法的情况下做到这一点? 例如,我可以在UITableView中使用-didselectRowAtIndexPath并关闭该视图-但是接收视图如何在不使用委托的情况下“通知”要返回的数据 Yes方法可以向前和向后发送数据,您
prepareforsgue
方法。我的理解是,这种方法应该真正用于向前传递数据,而不是向后传递数据
为此,我想尝试使用块—将数据传递回另一个viewController
我的问题是:如何在不使用prepareForSegue
方法的情况下做到这一点?
例如,我可以在UITableView中使用-
didselectRowAtIndexPath
并关闭该视图-但是接收视图如何在不使用委托的情况下“通知”要返回的数据 Yes方法可以向前和向后发送数据,您可以使用块
或委托
有关ios中块的更多信息,请使用此链接
希望它能对您有所帮助,thnx我知道您特别要求的解决方案不涉及
prepareforsgue
,但这似乎是基于这样的假设,即prepareforsgue
仅用于向前传递数据
有一种叫做“放松阶段”的方法可能对你的情况有所帮助。对此有详细的讨论
如果您特别希望为此使用块,只需将块特性添加到子控制器并让父控制器设置块。子控制器必须在解除块时调用该块。如果这样做,请注意保留循环。在我看来,在这种情况下,块并不是最好的解决方案,但如果没有更多的上下文,就很难有权威地说这样的话。在您的视图控制器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;
关于block有多棒,请注意以下几点:
secondViewController.h
文件中声明block
@property(非原子,复制)void(^myBlock)(NSString*)代码>
myBlock(@“这将显示在firstViewController中”)代码>
.h
文件导入您的firstViewController
.m
文件中
并将块定义为
secondViewController *ref =[[secondViewController alloc ]init];
ref.myBlock =^void(NSString *data)
{
self.labelOffirstviewcontroller=data;
};
您可以使用键/值观察。向NSNotificationCenter注册视图控制器并将数据传回视图控制器。键值观察与NSNotificationCenter不同。在这个问题中,我已将prepareForSegue
修改为prepareForSegue
,如果不正确,请随意重新编辑。最好在答案中发布内容和链接,而不仅仅是一个链接。不能保证链接在将来仍然会到达正确的位置。这是一个伟大的挑战!您可以将myBlock命名为任何您想要的名称,例如myColorBlock传递颜色信息等…绝对。。。你可以使用block来完成非常繁琐的任务,非常容易\