Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用块将数据传回视图控制器_Ios_Iphone_Objective C_Objective C Blocks - Fatal编程技术网

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有多棒,请注意以下几点:

  • MyViewControllerClass2不知道_completion()中定义了什么,这是重点,因为这与他无关

  • 您还可以在-dealloc中调用_completion(),甚至可以在MyViewControllerClass2将继续运行的某个地方调用

  • 可以将参数传递给块函数

  • 可以从块函数传递参数

  • 更多:)

  • 我真的鼓励人们对块进行良好的概述,并使用它们,因为它们非常酷

    重要

    使用块时不声明委托,委托方法和使用块的主要思想和抽象结果是相同的。此外,委托模式还具有更好的文档化和更严格的使用等优点。Still Block更加灵活,并且(当习惯时)更易于使用

    问候,

    hris.to

    向后发送数据

  • secondViewController.h
    文件中声明
    block

    @property(非原子,复制)void(^myBlock)(NSString*)

  • 在需要从secondViewController的.m文件传递数据的任何位置调用block

    myBlock(@“这将显示在firstViewController中”)

  • 3.将上述
    .h
    文件导入您的
    firstViewController
    .m
    文件中 并将
    块定义为

    secondViewController *ref =[[secondViewController alloc ]init];
      
         ref.myBlock =^void(NSString *data)
        {
        self.labelOffirstviewcontroller=data;
        };
    

    您可以使用键/值观察。向NSNotificationCenter注册视图控制器并将数据传回视图控制器。键值观察与NSNotificationCenter不同。在这个问题中,我已将
    prepareForSegue
    修改为
    prepareForSegue
    ,如果不正确,请随意重新编辑。最好在答案中发布内容和链接,而不仅仅是一个链接。不能保证链接在将来仍然会到达正确的位置。这是一个伟大的挑战!您可以将myBlock命名为任何您想要的名称,例如myColorBlock传递颜色信息等…绝对。。。你可以使用block来完成非常繁琐的任务,非常容易\