以编程方式快速定位miltiple视图

时间:2016-08-06 11:14:10

标签: swift loops

上一次帮助我的循环运行良好。但只有一次。如果我尝试重新加载它,我会得到以下错误:"索引超出范围"在以下行中:

let cardOnTop = cards[index-8]

有人能帮助我吗?

这是我的代码:

func layoutCards() {

        //  create cards array with several elements
        var cards = (1...64).map { _ in UIView() }// array with several cards


        //Loop through each card in the array
        for index in 0...cards.count-1 {



            // place the card in the view and turn off translateAutoresizingMask
            let thisCard = cards[index]

            thisCard.layer.borderWidth = 1
            thisCard.layer.borderColor = UIColor.blackColor().CGColor
            thisCard.backgroundColor = UIColor.greenColor()

            thisCard.translatesAutoresizingMaskIntoConstraints = false
            midView.addSubview(thisCard)

            //set the height and width constraints
            let widthConstraint = NSLayoutConstraint(item: thisCard, attribute: .Width, relatedBy: .Equal, toItem: midView, attribute: .Width, multiplier: 0.125, constant: 0)
            let heightConstraint = NSLayoutConstraint(item: thisCard, attribute: .Height, relatedBy: .Equal, toItem: midView, attribute: .Height, multiplier: 0.125, constant: 0)
            midView.addConstraints([heightConstraint, widthConstraint])

            //set the horizontal  position

            if (columnCounter > 0) {

                // card is not in the first column
                let cardOnTheLeft = cards[index-1]

                let leftSideConstraint = NSLayoutConstraint(item: thisCard, attribute: .Left, relatedBy: .Equal, toItem: cardOnTheLeft, attribute: .Right, multiplier: 1, constant: 0)

                //add constraint to the contentView
                midView.addConstraint(leftSideConstraint)

            } else {

                //card is in the first column

                let leftSideConstraint = NSLayoutConstraint(item: thisCard, attribute: .Left, relatedBy: .Equal, toItem: midView, attribute: .Left, multiplier: 1, constant: 0)

                //add constraint to the contentView
                midView.addConstraint(leftSideConstraint)

            }


            //set the vertical position

            if (rowCounter > 0) {

                // card is not in the first row
                let cardOnTop = cards[index-8]

                let topConstraint = NSLayoutConstraint(item: thisCard, attribute: .Top, relatedBy: .Equal, toItem: cardOnTop, attribute: .Bottom, multiplier: 1, constant: 0)

                // add constraint to the contentView
                midView.addConstraint(topConstraint)

            } else {

                //card is in the first row

                let topConstraint = NSLayoutConstraint(item: thisCard, attribute: .Top, relatedBy: .Equal, toItem: midView, attribute: .Top, multiplier: 1, constant: 0)

                //add constraint to the contentView
                midView.addConstraint(topConstraint)

            }



            //increment the column counter
            columnCounter = columnCounter+1

            //if the column counter reaches the fifth column reset it and increase the row counter
            if (columnCounter >= 8) {
                columnCounter = 0
                rowCounter = rowCounter+1
            }




        } // end of the loop



    }

1 个答案:

答案 0 :(得分:0)

你说第二次运行时失败了。这是因为您显然已将rowCountercolumnCounter声明为属性,而您每次rowCounter都没有将columnCounter0设置回layoutCards()被称为。

rowCountercolumnCounter设为layoutCards()的本地变量:

func layoutCards() {
    var rowCounter = 0
    var columnCounter = 0

    //  create cards array with several elements
    var cards = (1...64).map { _ in UIView() }// array with several cards