UICollectionView向后重新加载单元格

时间:2018-04-19 22:13:27

标签: ios swift collectionview reloaddata

我使用UICollectionView作为填字游戏的方形网格布局。用户将通过首先点击每个单元格以更改颜色来“创建”拼图,按“插入数字按钮”然后添加每个正方形的数字,最后按“获取线索”按钮。按下“插入数字按钮”时,将重新加载单元格以“固定”颜色,并且取消隐藏每个正方形编号的文本字段(仅适用于白色单元格)。当我重新加载单元格以使正方形的数字不可编辑时,问题出现了,单元格反向重新加载。即如果第一个单元格(索引0)具有数字,则更新最后一个单元格(索引63)。按两次按钮可将细胞放在正确的位置。

我已经打印了indexPath以查看哪个单元格包含文本,而且总是相反...

代码:

import UIKit

class gridSetup: UIViewController, UICollectionViewDataSource, 
UICollectionViewDelegate {

var setColours: Bool = true
var setNumbers: Bool = false
var numbers: Array = [Int]()
var whiteSquares:Array = [IndexPath]()
var gridSizer: Int?    //value passed in from previous screen

@IBOutlet weak var getCluesButton: UIButton!
@IBOutlet weak var insertNumbersButton: UIButton!
@IBOutlet weak var grid: UICollectionView!

let reuseIdentifier = "cell" 


override func viewDidLoad() {
    super.viewDidLoad()
    setColours = true
    setNumbers = false
    getCluesButton.isHidden = true

    self.navigationController?.isNavigationBarHidden = false
    // Do any additional setup after loading the view, typically from a nib.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - UICollectionViewDataSource protocol

// tell the collection view how many cells to make
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    //return (self.gridSizer * self.gridSizer)
    return (self.gridSizer! * self.gridSizer!)
}

// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


    // get a reference to our storyboard cell
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell

    cell.backgroundColor = UIColor.white

    if setColours == true {
        whiteSquares.append(indexPath) //initalise whiteSquares by adding all the squares
        cell.cellGuess.isHidden = true  //hide the letter guesses
        cell.squareNumber.isHidden = true   //hide the sqaure numbers
    }

    //redraw cells to fix the colours

    // if we are on a white cell and are done setting colours
    if setColours == false && whiteSquares.contains(indexPath) == true {
        if setNumbers == true {
            cell.squareNumber.isHidden = false
        }
        else {
            if cell.squareNumber.text != "" {

                print("I have a number inside, Index: ", indexPath.row)


            }
            cell.squareNumber.isUserInteractionEnabled = false
            cell.squareNumber.placeholder = ""
            cell.cellGuess.isHidden = false
            return cell
        }
        }

    // on a black square
    else if setColours == false && whiteSquares.contains(indexPath) == false {
        cell.squareNumber.isHidden = true
        //print("on a black square", indexPath)
        cell.backgroundColor = UIColor.black
        cell.squareNumber.isHidden = true
        cell.cellGuess.isHidden = true   
    }
        //initial grid setup
    else {

        cell.backgroundColor = UIColor.white
        cell.layer.borderColor = UIColor.black.cgColor
        cell.squareNumber.isHidden = true
    }

    cell.layer.borderWidth = 1
    cell.layer.cornerRadius = 8
    return cell
}


// MARK: - UICollectionViewDelegate protocol

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    // handle tap events
    //print("You selected cell #\(indexPath.item)!")

}

// change background color back when user releases touch
func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {

    let cell = collectionView.cellForItem(at: indexPath)

    if setColours == true {
        if cell?.backgroundColor == UIColor.black {
            //print("add", indexPath.row)
            cell?.backgroundColor = UIColor.white
            var k: Int = 0
            for i in whiteSquares {

                if indexPath.row < i.row {
                    whiteSquares.insert(indexPath, at: k)
                    break
                }
                else {
                    k += 1
                }
            }

            }
        else {
            //print("remove", indexPath.row)
            cell?.backgroundColor = UIColor.black
            var k: Int = 0
            for i in whiteSquares {

                if indexPath.row == i.row {
                    whiteSquares.remove(at: k)
                }
                else {
                    k += 1
                }
            }

        }
    }
}

@IBAction func getClues(_ sender: Any) {
    setNumbers = false
    grid.reloadData()   //problem comes from/after calling this function
}

@IBAction func insertNumbers(_ sender: Any) {
    setColours = false
    insertNumbersButton.isHidden = true
    setNumbers = true
    getCluesButton.isHidden = false
    grid.reloadData()

}
}
// some layout stuff, (not important)
extension gridSetup: UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let width = collectionView.frame.size.width / (CGFloat(gridSizer! + 1))
    //let width = collectionView.frame.size.width / (CGFloat(gridSizer! + 1))
    let height = width

    return  CGSize(width: width, height: height)
}
}

'1'应位于第1行,第2列

'1' should be in the second cell

0 个答案:

没有答案