[英]Using blocks to pass data back to view controller
我在看這個問題 。
其中一個答案顯示了如何使用塊向后傳遞數據查看prepareForSegue
方法。 我的理解是這種方法應該用於向前傳遞數據,而不是向后傳遞數據。
我想為此目的嘗試阻塞 - 將數據傳遞回另一個viewController。
我的問題是:如何在不使用prepareForSegue
方法的情況下執行此操作? 我可以在UITableView中使用 - didselectRowAtIndexPath
並關閉視圖 - 但接收視圖如何“通知”有數據返回,而不使用委托?
向后發送數據
在secondViewController.h
文件中聲明block
@property (nonatomic, copy)void(^myBlock)(NSString *);
調用塊,無論你需要從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;
關於如何令人敬畏的塊是幾個注釋:
MyViewControllerClass2不知道在_completion()中定義了什么是主要觀點,因為這不是他關心的問題
您也可以在-dealloc中調用_completion(),甚至在MyViewControllerClass2將繼續運行的某個地方調用
您可以將參數傳遞給塊函數
您可以從塊函數傳遞參數
還有很多 :)
我真的很鼓勵人們使用它們很好地了解塊和stat,因為它們非常酷。
重要!
使用塊時你沒有聲明委托,委托方法和使用塊的主要思想和抽象結果是相同的。 委托模式具有更好的記錄和更嚴格的使用等優點。 靜止塊更靈活,(當習慣時)更容易使用。
問候,
hris.to
我知道您專門詢問了一個不涉及prepareForSegue
的解決方案,但這似乎是基於prepareForSegue
僅用於傳遞數據的假設。
有一種稱為放松segue的東西可能對你的情況有幫助。 關於被如此詳細的討論在這里 。
如果您特別想要使用塊,則可以簡單地將塊屬性添加到子控制器並讓父控制器設置塊。 子控制器在被解除時必須調用該塊。 如果你這樣做,請注意保留循環。 對我來說聽起來不像塊是這種情況下的最佳解決方案,但是如果沒有更多的上下文就很難說出具有權威性的東西。
是方法可以向前發送數據以及向后發送數據,您可以使用Blocks
或Delegates
有關ios中塊的更多信息,請使用此鏈接點擊這里
希望它能幫助你,thnx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.