block 傳值 遇到的出錯點:Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)
Home介面也就是需要接收值的介面。
#pragma mark 推出登入介面
-(void)loginAction:(id)sender
{
LoginViewController *loginVC = [[LoginViewControlleralloc]init];
#warning 遇到block,先執行block塊外的語句,再執行塊內語句
//block 的定義
loginVC.block = ^(NSString *text){
// self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:text style:UIBarButtonItemStyleDone target:nil action:nil];
NSLog(@"傳過來的值:%@",text);
};
#warning 前後建立的物件是不一樣的
//之前出錯就是一到LoginViewController.m中的self.block(name)就直接斷了,原因是因為我在這裡的跳轉之前又建立了一個新的.
[self.navigationControllerpushViewController:[LoginViewControllernew] animated:YES];
}
====================================
傳值的那個介面的.h
#import <UIKit/UIKit.h>
//宣告一個block用來傳值,注意給block取別名的預設返回值是int
typedef void (^blockLoginTitle)(NSString *title);
@interface LoginViewController : UIViewController
//宣告一個屬性,方便使用blockLoginTitle
@property(nonatomic,strong)blockLoginTitle block;
@end
===========================
.m
#pragma mark 登入按鈕事件的響應
-(void)loginBtnAction:(UIButton
{
//獲取登入介面的輸入資訊
NSString *name = _loginView.nameLTView.textField.text;
NSString *pwd = _loginView.passLTView.textField.text;
#pragma mark 去資料庫中取到值
NSArray *result = [[DBManagersharedDBManager] selectAllUser];
for (User *user in result) {
if ([name isEqualToString:user.name] && [pwd isEqualToString:user.password])
{
#warning 這裡直接出錯,沒有任何錯誤提醒,只有 Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)
//呼叫block
self.block(name);
[self.navigationControllerpopToRootViewControllerAnimated:YES];
}
}
}
============================正確的修改:
在要接收值的介面中:
把
[self.navigationControllerpushViewController[LoginViewControllernew] animated:YES];
改為:
[self.navigationControllerpushViewController:loginVC animated:YES];
==============================
還需要注意的一點就是,block傳值,傳值語句是在推出第一個頁面之前,接收值的語句是在第一個頁面推出第二個頁面之前。
因為,block塊之後的語句比block塊內的語句先執行。