Swift 3 - UIButton 从 plist 和数据库添加 setTitle

Swift 3 - UIButton adding setTitle from plist and database

我有 plist 文件和数据库,plist 文件中有英文字母,数据库行中有字符串,例如(伦敦),我将字符串转换为字符数组并附加到 plist 文件中。我通过(for 循环)创建了 14 个 UIButton,我从数据库行中获得了 setTitle,并从 plist 中获得了 shuffle 和添加字母,并获得了 shuffle。

所以我的问题是当从数据库中添加我的字符​​时,只显示数据库中的字符并像这样打乱:

但我不需要首先将数据库中的所有字符添加到 setTitle 并打乱顺序,然后从 plist 文件中添加剩余的空按钮,如下所示:

我怎样才能像上图(第二张图)一样?!

这是我的代码,写代码有什么问题?? :

let fileName : String = " EnglishLetters"
let fileExt : String = "plist"
let pathRes = Bundle.main.path(forResource: fileName, ofType: fileExt)
let pathDict = NSDictionary(contentsOfFile: pathRes!)
var letters : [String] = pathDict?.object(forKey: "Letters") as! [String]

for data in listdata { // SQLite database

    let dataAnswer = data.ans // ans is a row in the SQLite database 
    let dataArrayAnswer = dataAnswer.characters.map{String([=11=])}
    letters.append(contentsOf: dataArrayAnswer)

    for char in dataArrayAnswer {}

        for i in 1...14 {

            let tileButton = UIButton(type: .roundedRect)
            let lettersAns = dataArrayAnswer.shuffled()[letters.distance(from: id, to: id)] // id is parameter
            tileButton.setTitle(lettersAns, for: .normal)
            tileButton.titleLabel?.font = UIFont(name: "HelveticaNeueW23forSKY-Bd", size: 15)
            tileButton.setTitleColor(.black, for: .normal)
            tileButton.setBackgroundImage(UIImage(named: "Cell"), for: .normal)            
            tileButton.addTarget(self, action: #selector(moveTile(sender:)), for: .touchUpInside)
            xAxis = xAxis + buttonWidth + space

            view.addSubview(tileButton)


            if i%7 == 0 {

               xAxis = emptySpace / 2
               yAxis = yAxis2 + space

            }

        }
    }
 }

您需要做的是首先创建一个包含所有目标字母(打乱并添加随机字母)的数组,然后 运行 在该数组上更新按钮标题。

首先用随机字母填充一个 14 值数组:

var presentedLetters : [String] = [String]()
var availableLetters : [String] = pathDict?.object(forKey: "Letters") as! [String]

var availableLetterIndexes : [Int] = Array(0..<availableLetters.count)

for letterAt in 0 ..< 14
{
    let randomIndex : Int = Int(arc4random_uniform(UInt32(availableLetterIndexes.count)))
    var charIndex : Int = availableLetterIndexes[randomIndex]

    presentedLetters.append(availableLetters[charIndex])

    availableLetterIndexes.remove(at: randomIndex)
}

为答案字符串生成可用位置:

var availableIndexes : [Int] = Array(0..<presentedLetters.count)

然后从数据库中检查你的字母并将它们添加到目标数组中的随机位置(同时记住添加的索引以防止覆盖字母):

var addedAnswerIndexes : [Int] = [Int]()

let answerString = data.ans // ans is a row in the SQLite database 
let answerCharacters = answerString.characters.map{String([=12=])}

for answerCharAt in answerCharacters
{
    let randomIndex : Int = Int(arc4random_uniform(UInt32(availableIndexes.count)))
    var charIndex : Int = availableIndexes[randomIndex]

    presentedLetters[charIndex] = answerCharAt

    availableIndexes.remove(at: randomIndex)
}

然后 presentedLetters 将具有所有相关值的数组。

编辑:

要将标题添加到按钮,只需遍历 presentedLetters 数组:

        for i in 1...14 {

            let tileButton = UIButton(type: .roundedRect)
            tileButton.setTitle(presentedLetters[i-1], for: .normal)

            ......

        }
    }

祝你好运!