毫无意义的Sigabart错误



我的代码是:

   import UIKit
class BreakOutViewController: UIViewController, UICollisionBehaviorDelegate
{
    var blockArray: [Block] = []
    var allViewsArray: [UIView] = []
    var screenWidth = (Float)(UIScreen.mainScreen().bounds.width)
    var screenHight = (Float)(UIScreen.mainScreen().bounds.height)
    var blockCount = 0
    var dynamicAnimator = UIDynamicAnimator()
    var ballArray : [UIView] = []
    var collisionBehavior = UICollisionBehavior()
//    var paddle = Block(frame: CGRect(x: 140, y: 645, width: 150, height: 10))
//    var ball = Block(frame: CGRect(x: 197, y: 614, width: 30, height: 30))
    var paddle = UIView()
    var ball = UIView()
    override func viewDidLoad() {
        super.viewDidLoad()
       dynamicAnimator = UIDynamicAnimator(referenceView: view)
        createBlocks()
        createPaddle()
        createBall()
        giveDynamicProperties()
     }
    func createBlocks()
    {
        var xPosition = 10
        var yPosition = 20
        let blockWidth = (Int(screenWidth - 55 ) / 5)
        let blockHeight = 20
        for rows in 1...10
        {
            for columns in 1...7
            {
                var drand1 = CGFloat(drand48())
                var drand2 = CGFloat(drand48())
                var drand3 = CGFloat(drand48())
                var block = Block(frame: CGRect(x: xPosition, y: yPosition, width: blockWidth, height: blockHeight))
                view.backgroundColor = UIColor.cyanColor()
                block.backgroundColor = UIColor(red: drand1, green: drand2, blue: drand3, alpha: 1)
                view.addSubview(block)
                allViewsArray.append(block)
                blockArray.append(block)
                ++blockCount
                xPosition += (blockWidth + 10)
            }

            xPosition = 10
            yPosition += (blockHeight + 10)
        }
    }

    func createPaddle()
    {
        var paddle = Block(frame: CGRect(x: 140, y: 645, width: 150, height: 10))
        var drand11 = CGFloat(drand48())
        var drand12 = CGFloat(drand48())
        var drand13 = CGFloat(drand48())
        paddle.backgroundColor = UIColor(red: drand11, green: drand12, blue: drand13, alpha: 1)
        view.addSubview(paddle)
        allViewsArray.append(paddle)
    }

    func createBall()
    {
        var ball = Block(frame: CGRect(x: 197, y: 614, width: 30, height: 30))
        ball.layer.cornerRadius = 15
        var drand21 = CGFloat(drand48())
        var drand22 = CGFloat(drand48())
        var drand23 = CGFloat(drand48())
        ball.backgroundColor = UIColor(red: drand21, green: drand22, blue: drand23, alpha: 1)
        view.addSubview(ball)
        allViewsArray.append(ball)
           }        
    func giveDynamicProperties()
    {
        let dynamicItemBehavoir = UIDynamicItemBehavior(items: blockArray)
        dynamicItemBehavoir.elasticity = 1.0
        dynamicItemBehavoir.density = 100000
        dynamicItemBehavoir.friction = 111111110
        dynamicItemBehavoir.resistance = 1111110
        dynamicItemBehavoir.allowsRotation = false
        dynamicAnimator.addBehavior(dynamicItemBehavoir)
        let dynamicItemBehavoir2 = UIDynamicItemBehavior(items: [paddle] )
        dynamicItemBehavoir2.elasticity = 1.0
        dynamicItemBehavoir2.density = 100000
        dynamicItemBehavoir2.friction = 111111110
        dynamicItemBehavoir2.resistance = 1111110
        dynamicItemBehavoir2.charge = 3.0
        dynamicItemBehavoir2.allowsRotation = false
        dynamicAnimator.addBehavior(dynamicItemBehavoir2)
        let dynamicItemBehavoir3 = UIDynamicItemBehavior(items: [ball] )
        dynamicItemBehavoir3.elasticity = 1.0
        dynamicItemBehavoir3.resistance = 0
        dynamicItemBehavoir3.allowsRotation = false
        dynamicAnimator.addBehavior(dynamicItemBehavoir3)

        let pushBehavior = UIPushBehavior(items: [ball], mode: .Instantaneous)
        pushBehavior.magnitude = 5
        pushBehavior.pushDirection = CGVectorMake(-1.0 , 0.9 )
        dynamicAnimator.addBehavior(pushBehavior)
        collisionBehavior.translatesReferenceBoundsIntoBoundary = true
        collisionBehavior = UICollisionBehavior(items: allViewsArray)
          collisionBehavior.collisionDelegate = self
//        collisionBehavior.addBoundaryWithIdentifier("verticalMin", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(0, CGRectGetHeight(view.frame)))
//        collisionBehavior.addBoundaryWithIdentifier("verticalMax", fromPoint: CGPointMake(CGRectGetMaxX(view.frame), 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetHeight(view.frame)))
//        collisionBehavior.addBoundaryWithIdentifier("horizontalMin", fromPoint: CGPointMake(0, CGRectGetMaxY(view.frame)), toPoint: CGPointMake(CGRectGetMaxX(view.frame), CGRectGetMaxY(view.frame)))
//        collisionBehavior.addBoundaryWithIdentifier("horizontalMax", fromPoint: CGPointMake(0, 0), toPoint: CGPointMake(CGRectGetMaxX(view.frame), 0))
        collisionBehavior.collisionMode = UICollisionBehaviorMode.Everything
        dynamicAnimator.addBehavior(collisionBehavior)       
    }
    override func prefersStatusBarHidden() -> Bool {
        return true
    }
    @IBAction func pan(sender: UIPanGestureRecognizer)
    {            
        paddle.center = CGPointMake(sender.locationInView(view).x, paddle.center.y)
        dynamicAnimator.updateItemUsingCurrentState(paddle)
        //remove all beahavoris for dynamic animator
        //remove from subview
    }
    func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item1: UIDynamicItem, withItem item2: UIDynamicItem)
    {
        for block in blockArray
        {
            if item1.isEqual(Block) && item2.isEqual(ball)
            {
                //                 block dissappear
                block.removeFromSuperview()
                dynamicAnimator.updateItemUsingCurrentState(blockArray.removeAtIndex(0))
                //     collisionBehavior.removeItem(block)
                --blockCount
                print(blockCount)
            }                
            dynamicAnimator.updateItemUsingCurrentState(block)
        }
    }    
}

在输出中,我得到:

2016-04-12 10:25:48.321 Dynamic Animator[8732:289665] *** Assertion failure in -[UIDynamicAnimator _registerBodyForItem:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UIDynamicAnimator.m:872
2016-04-12 10:25:48.343 Dynamic Animator[8732:289665] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid size {0, 0} for item <UIView: 0x7fdab1d34010; frame = (0 0; 0 0); layer = <CALayer: 0x7fdab1d34180>> in Dynamics'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000108f77e65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010aedfdeb objc_exception_throw + 48
    2   CoreFoundation                      0x0000000108f77cca +[NSException raise:format:arguments:] + 106
    3   Foundation                          0x00000001095e84de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
    4   UIKit                               0x000000010a3ffaca -[UIDynamicAnimator _registerBodyForItem:] + 784
    5   UIKit                               0x0000000109c968c0 -[UIDynamicItemBehavior _reevaluate:] + 306
    6   UIKit                               0x0000000109c969b1 -[UIDynamicItemBehavior _associate] + 66
    7   UIKit                               0x000000010a3fc700 -[UIDynamicAnimator _registerBehavior:] + 306
    8   UIKit                               0x000000010a3fc4bc -[UIDynamicAnimator addBehavior:] + 118
    9   Dynamic Animator                    0x00000001089e5ea3 _TFC16Dynamic_Animator22BreakOutViewController21giveDynamicPropertiesfS0_FT_T_ + 675
    10  Dynamic Animator                    0x00000001089e4aca _TFC16Dynamic_Animator22BreakOutViewController11viewDidLoadfS0_FT_T_ + 378
    11  Dynamic Animator                    0x00000001089e4b42 _TToFC16Dynamic_Animator22BreakOutViewController11viewDidLoadfS0_FT_T_ + 34
    12  UIKit                               0x0000000109b52f98 -[UIViewController loadViewIfRequired] + 1198
    13  UIKit                               0x0000000109b532e7 -[UIViewController view] + 27
    14  UIKit                               0x0000000109bb679c -[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:] + 502
    15  UIKit                               0x0000000109bb5710 -[UITabBarController transitionFromViewController:toViewController:] + 59
    16  UIKit                               0x0000000109bb1522 -[UITabBarController _setSelectedViewController:] + 377
    17  UIKit                               0x0000000109bb1398 -[UITabBarController setSelectedViewController:] + 234
    18  UIKit                               0x0000000109bb5581 -[UITabBarController _tabBarItemClicked:] + 481
    19  UIKit                               0x00000001099be194 -[UIApplication sendAction:to:from:forEvent:] + 92
    20  UIKit                               0x0000000109d8f6c4 -[UITabBar _sendAction:withEvent:] + 498
    21  UIKit                               0x00000001099be194 -[UIApplication sendAction:to:from:forEvent:] + 92
    22  UIKit                               0x0000000109b2d6fc -[UIControl sendAction:to:forEvent:] + 67
    23  UIKit                               0x0000000109b2d9c8 -[UIControl _sendActionsForEvents:withEvent:] + 311
    24  UIKit                               0x0000000109d9479c -[UITabBar(Static) _buttonUp:] + 103
    25  UIKit                               0x00000001099be194 -[UIApplication sendAction:to:from:forEvent:] + 92
    26  UIKit                               0x0000000109b2d6fc -[UIControl sendAction:to:forEvent:] + 67
    27  UIKit                               0x0000000109b2d9c8 -[UIControl _sendActionsForEvents:withEvent:] + 311
    28  UIKit                               0x0000000109b2caf8 -[UIControl touchesEnded:withEvent:] + 601
    29  UIKit                               0x0000000109a2d49b -[UIWindow _sendTouchesForEvent:] + 835
    30  UIKit                               0x0000000109a2e1d0 -[UIWindow sendEvent:] + 865
    31  UIKit                               0x00000001099dcb66 -[UIApplication sendEvent:] + 263
    32  UIKit                               0x00000001099b6d97 _UIApplicationHandleEventQueue + 6844
    33  CoreFoundation                      0x0000000108ea3a31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    34  CoreFoundation                      0x0000000108e9995c __CFRunLoopDoSources0 + 556
    35  CoreFoundation                      0x0000000108e98e13 __CFRunLoopRun + 867
    36  CoreFoundation                      0x0000000108e98828 CFRunLoopRunSpecific + 488
    37  GraphicsServices                    0x000000010e501ad2 GSEventRunModal + 161
    38  UIKit                               0x00000001099bc610 UIApplicationMain + 171
    39  Dynamic Animator                    0x00000001089ecefd main + 109
    40  libdyld.dylib                       0x000000010b9f192d start + 1
    41  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

无论我做什么,我都会得到这个。问题出在哪里?我遇到了一个sigabart错误,我已经尝试了一切方法来修复它。

这很有道理。

错误消息中最重要的部分是

由于未捕获的异常"NSInternalConsistencyException",,正在终止应用程序

原因:'项目<的大小{0,0}无效;UI视图:0x7fdab1d34010;帧=(0 0;0 0)

您必须使用指定的UIView 初始值设定项

init(frame frame: CGRect)

提供一个大小而不是默认的初始值设定项(括号)

我认为这里缺少的是,当您在createBall()函数中执行var ball = Block(frame: CGRect(x: 197, y: 614, width: 30, height: 30))时,您正在创建一个与ball属性无关的新视图。

然后,当您将行为添加到ball属性时,它指的是您使用UIView()创建的属性,该属性的默认框架为CGRect.zero,您将获得异常。

createBall()函数中,您应该在不使用var的情况下执行ball = Block(frame: CGRect(x: 197, y: 614, width: 30, height: 30)),以便它分配给您现有的属性,而不是创建新视图。同样的事情也适用于你的球拍。

最新更新