block 传值 遇到的出错点:Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)

来源:互联网 发布:java调用nodejs程序 编辑:程序博客网 时间:2024/06/11 05:17


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

typedefvoid (^blockLoginTitle)(NSString *title);


@interface LoginViewController :UIViewController



//声明一个属性,方便使用blockLoginTitle

@property(nonatomic,strong)blockLoginTitle block;


@end



===========================

.m

#pragma mark 登录按钮事件的响应

-(void)loginBtnAction:(UIButton *)sender

{

    //获取登录界面的输入信息

    NSString *name =_loginView.nameLTView.textField.text;

    NSString *pwd =_loginView.passLTView.textField.text;

 

    

    

#pragma mark 去数据库中取到值

    

    

    NSArray *result = [[DBManagersharedDBManager] selectAllUser];

    

    

   for (User *userin result) {

        

       if ([name isEqualToString:user.name] && [pwdisEqualToString:user.password])

        {

#warning 这里直接出错,没有任何错误提醒,只有 Thread 1:EXC_BAD_ACCESS(code=1,address=0x10)

           //调用block

           self.block(name); 

            

            [self.navigationControllerpopToRootViewControllerAnimated:YES];

        }

        

    }

    

}

============================


正确的修改:

在要接收值的界面中:

[self.navigationController pushViewController[LoginViewController newanimated:YES];

改为:

[self.navigationControllerpushViewController:loginVC animated:YES];


==============================


还需要注意的一点就是,block传值,传值语句是在推出第一个页面之前,接收值的语句是在第一个页面推出第二个页面之前。

因为,block块之后的语句比block块内的语句先执行。



1 0
原创粉丝点击