使用块将数据传递回视图控制器

Rob*_*egg 4 iphone objective-c ios objective-c-blocks

我在看这个问题.

其中一个答案显示了如何使用块向后传递数据查看prepareForSegue方法.我的理解是这种方法应该用于向前传递数据,而不是向后传递数据.

我想为此目的尝试阻塞 - 将数据传递回另一个viewController.

我的问题是:如何在不使用prepareForSegue方法的情况下执行此操作?我可以在例如UITableView中使用 - didselectRowAtIndexPath并且忽略视图 - 但接收视图如何被"通知"有数据返回,而不使用委托?

Anu*_*uni 10

向后发送数据

  1. block在你的secondViewController.h文件中声明

    @property (nonatomic, copy)void(^myBlock)(NSString *);

  2. 调用块,无论你需要从.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)


hri*_*.to 5

在您的视图控制器 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)

关于区块有多棒的几点说明:

  1. MyViewControllerClass2 不知道 _completion() 中定义了什么,这是重点,因为这不是他关心的

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

  3. 您可以将参数传递给块函数

  4. 您可以从块函数传递参数

  5. 还有很多 :)

我真的鼓励人们对使用它们的块和统计数据有很好的了解,因为它们非常酷。

重要的!

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

问候,

克里斯托