关于属性传值为空的问题

先来看下面这段代码:

_collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) {
        DetailViewController *detailVC=[[DetailViewController alloc]init];
        //一定要记得设置控制器的背景颜色,否则会造成push卡顿的假象
        detailVC.view.backgroundColor=[UIColor whiteColor];
        detailVC.video=video;
        [weakSelf.navigationController pushViewController:detailVC animated:YES ];
    };

这样进行属性传值,在DetailViewController控制器的-(void)viewDidLoad方法里面打印video属性的值为nil(因为我们通常在该方法中使用传过来的属性值)。罪魁祸首就在这句代码:detailVC.view.backgroundColor=[UIColorwhiteColor],
因为这句代码一执行,-(void)viewDidLoad方法提前调用,此时video属性还未被赋值,所有video属性的值为nil

解决方案一:属性传值的代码写在init之后,目的就是在调用-(void)viewDidLoad方法之前给属性赋值
 _collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) {
       DetailViewController *detailVC=[[DetailViewController alloc]init];
        detailVC.video=video;
        //一定要记得设置控制器的背景颜色,否则会造成push卡顿的假象
        detailVC.view.backgroundColor=[UIColor whiteColor];
        [weakSelf.navigationController pushViewController:detailVC animated:YES ];
    };

解决方案二:在-(void)viewWillAppear里面使用传过来的属性值(慎用)
#import "DetailViewController.h"
#import "PlayVideoView.h"
#import "Video.h"

@interface DetailViewController ()
@property (nonatomic,strong) PlayVideoView *playView;
@end

@implementation DetailViewController


-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];
    self.playView.video=self.video;
}
ps:只能在这里面传数据,不能在这里面添加子视图,否则的话每次加载控制器都会重复添加子视图。因为 - ( void )viewDidLoad只会加载一次 ,而-(void)viewWillAppear这个方法只要控制器出现就会加载

解决方案三:既然根本原因是提前调用了-(void)viewDidLoad方法,那么就不让它提前调用,采用此方案的好处就是后面可以照常在
-(void)viewDidLoad方法里面获取传过来的属性值
_collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) {
        DetailViewController *detailVC=[[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
        detailVC.video=video;
        [weakSelf.navigationController pushViewController:detailVC animated:YES ];
    };

ps:其实所有解决方案都是基于调用顺序的原理,目的都是保证在使用属性之前成功给属性赋值。
pps:一定要尽量避免这种情况出现,能不提前设置控制器的背景颜色就不要提前设置,比如说可以在控制器的-loadview方法设置它的背景颜色。




当使用Vue与Spring Boot结合使用时,通过axios进行post请求时出现传值为空的情况,可能是以下几个原因: 1. 参数未正确设置:在进行post请求时,需要使用axios的`data`属性来传递参数,而不是使用`params`属性。确保在axios的post请求中正确设置了请求的参数。 2. 后端接收参数的方式不正确:在Spring Boot后端代码中,使用`@RequestBody`注解来接收前端传递的参数,而不是使用`@RequestParam`注解。`@RequestBody`注解将请求体的内容与后端方法的参数绑定在一起,确保后端能够正确接收到前端传递的参数。 3. 参数名不匹配:确保前端传递的参数名与后端接收参数的变量名相匹配。在前端的Vue代码中,检查传递给post请求的参数名是否正确和后端代码中定义的参数名一致。 4. 请求头未设置正确:在进行post请求时,可能需要设置请求的Content-Type为`application/json`或`application/x-www-form-urlencoded`。检查axios的请求头是否正确设置了Content-Type,确保与后端代码相匹配。 5. 跨域问题:如果前端Vue项目与后端Spring Boot项目部署在不同的域名或端口上,可能会存在跨域问题。在后端代码中,可以通过`@CrossOrigin`注解来解决跨域问题。 综上所述,解决vue springboot axios post方法传值为空问题需要检查参数设置、后端接收方式、参数名匹配、请求头设置和跨域等方面的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值