swift 请小心使用你的get方法,should be a descendant of reference view

如果你在用swift的get创建subview那么小心了,你每次使用该对象时都会重新初始化,你在其他地方相同属性代码会被覆盖。

举例说明:

我在这里初始化BallView

 var ballView:BallView{
        let ballView = BallView(frame: CGRect(origin: CGPoint(x:self.center.x-40,y:self.center.y - 40), size: CGSize(width: 80, height: 80)))
        ballView.backgroundColor = UIColor.white;
        return ballView;
    }


这里addSubView
  override func layoutSubviews() {
     super.layoutSubviews()
        let originX = (self.width-self.paddleSize.width)/2.0
        let orignY = self.hight - 20-self.paddleSize.height;
        let origin =  CGPoint(x:originX,y:orignY)
        paddleView = UIView(frame:CGRect(origin: origin, size: paddleSize));
        paddleView!.backgroundColor = UIColor.orange;
       self.addSubview(paddleView!)
        self.addSubview(ballView);
        self.addBallFallingBehavior();
    }


但是出现了一个奇怪的错误

erminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'View item (<DropProjectsGame.BallView: 0x7fd5697137d0; frame = (167 303.5; 80 80); layer = <CALayer: 0x60000023d800>>) should be a descendant of reference view in <UIDynamicAnimator: 0x7fd56941d460> Stopped (0.000000s) in <(null): 0x0> {{0, 0}, {80, 80}}'


我就纳闷了,明明就

        self.addSubview(ballView);

还报错ballView不从属于UIDynamicAnimator的 referenceView.  
原因在这里
func addBallFallingBehavior(){
        dynamicAnimator.addBehavior(objectBehavior);
        objectBehavior.addGravityCollisionForItems(items: [self.ballView]);

    }


这里为ballView添加Behavior的时候,它会每次去重新获取get方法,导致每次对象都是新的,于是就出现了上面的错误。

正确的修正不要使用get方法初始化View

  var ballView:BallView = {
        let ballView = BallView()
        ballView.backgroundColor = UIColor.white;
        return ballView;
    }()
这样就行了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值