簡體   English   中英

使用塊將數據傳遞回視圖控制器

[英]Using blocks to pass data back to view controller

我在看這個問題

其中一個答案顯示了如何使用塊向后傳遞數據查看prepareForSegue方法。 我的理解是這種方法應該用於向前傳遞數據,而不是向后傳遞數據。

我想為此目的嘗試阻塞 - 將數據傳遞回另一個viewController。

我的問題是:如何在不使用prepareForSegue方法的情況下執行此操作? 我可以在UITableView中使用 - didselectRowAtIndexPath並關閉視圖 - 但接收視圖如何“通知”有數據返回,而不使用委托?

向后發送數據

  1. secondViewController.h文件中聲明block

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

  2. 調用塊,無論你需要從secondViewController .m文件傳遞數據

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

3.在你的firstViewController .m文件中導入.h文件並將你的block定義為

secondViewController *ref =[[secondViewController alloc ]init];

     ref.myBlock =^void(NSString *data)
    {
    self.labelOffirstviewcontroller=data;
    };

在視圖控制器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. 還有很多 :)

我真的很鼓勵人們使用它們很好地了解塊和stat,因為它們非常酷。

重要!

使用塊時你沒有聲明委托,委托方法和使用塊的主要思想和抽象結果是相同的。 委托模式具有更好的記錄和更嚴格的使用等優點。 靜止塊更靈活,(當習慣時)更容易使用。

問候,

hris.to

我知道您專門詢問了一個不涉及prepareForSegue的解決方案,但這似乎是基於prepareForSegue僅用於傳遞數據的假設。

有一種稱為放松segue的東西可能對你的情況有幫助。 關於被如此詳細的討論在這里

如果您特別想要使用塊,則可以簡單地將塊屬性添加到子控制器並讓父控制器設置塊。 子控制器在被解除時必須調用該塊。 如果你這樣做,請注意保留循環。 對我來說聽起來不像塊是這種情況下的最佳解決方案,但是如果沒有更多的上下文就很難說出具有權威性的東西。

是方法可以向前發送數據以及向后發送數據,您可以使用BlocksDelegates有關ios中塊的更多信息,請使用此鏈接點擊這里

希望它能幫助你,thnx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM