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

时间:2014-01-28 05:42:57

标签: ios iphone objective-c objective-c-blocks

我在看this question

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

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

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

4 个答案:

答案 0 :(得分:10)

向后发送数据

  1. block 文件中声明secondViewController.h

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

  2. 在需要从 secondViewController 的.m文件传递数据的地方调用阻止

    myBlock(@"this will displayed in firstViewController");

  3. 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;

关于如何棒块的几点说明:

  1. MyViewControllerClass2不知道在_completion()中定义了什么是主要观点,因为这不是他关心的问题

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

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

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

  5. 更多:)

  6. 我真的很鼓励人们使用它们很好地了解块和stat,因为它们非常酷。

    重要!

    使用块时你没有声明委托,委托方法和使用块的主要思想和抽象结果是相同的。委托模式具有更好的记录和更严格的使用等优点。静止块更灵活,(当习惯时)更容易使用。

    此致

    hris.to

答案 2 :(得分:3)

我知道您专门询问了不涉及prepareForSegue的解决方案,但这似乎是基于prepareForSegue仅用于传递数据的假设。

有一种叫做放松的东西可能会对你的情况有所帮助。有关SO here的详细讨论。

如果您特别想要使用块,则可以简单地将块属性添加到子控制器并让父控制器设置块。子控制器在被解除时必须调用该块。如果你这样做,请注意保留循环。对我来说听起来不像块是这种情况下的最佳解决方案,但是如果没有更多的上下文,很难用权威来说这样的话。

答案 3 :(得分:0)

是的方法可以向前和向后发送数据,因为您可以使用BlocksDelegates 有关ios中块的更多信息,请使用此链接 CLICK HERE

希望它能帮助你,thnx