Swift 3-UIButton agregando setTitle desde plist y base de datos
database sqlite (1)
Lo que debe hacer primero es crear una matriz con todas sus letras objetivo (barajadas y agregadas al azar) y luego ejecutar esa matriz para actualizar los títulos de los botones.
Comienza rellenando un conjunto de 14 valores con letras al azar:
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)
}
Genere posiciones disponibles para la cadena de respuestas:
var availableIndexes : [Int] = Array(0..<presentedLetters.count)
A continuación, revise sus letras desde el archivo db y agréguelas en lugares aleatorios dentro de la matriz de destino (mientras recuerda los índices agregados para evitar que se sobrescriban las letras):
var addedAnswerIndexes : [Int] = [Int]()
let answerString = data.ans // ans is a row in the SQLite database
let answerCharacters = answerString.characters.map{String($0)}
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)
}
Y luego, letterspresentado tendrá una matriz de todos los valores relevantes.
EDITAR:
Para agregar los títulos a los botones, simplemente revise el conjunto de Cartas presentadas:
for i in 1...14 {
let tileButton = UIButton(type: .roundedRect)
tileButton.setTitle(presentedLetters[i-1], for: .normal)
......
}
}
¡Buena suerte!
Tengo un archivo plist y una base de datos, en el archivo plist tiene letras en inglés y en la fila de la base de datos tiene String, por ejemplo (Londres) y convierto String en una matriz de caracteres y anexé al archivo plist. Creé 14 UIButtons por (para loop) y me dieron setTitle desde la fila de la base de datos y se les asignó aleatoriamente y agregué letras de plist y shuffle dado.
Entonces mi problema es que cuando agrego mis caracteres de la base de datos me muestro solo los caracteres de la base de datos y los baraje así:
Pero no necesito solo que primero tenga que agregar a setTitle todos los caracteres de la base de datos y se barajan y el botón vacío restante se agrega desde el archivo plist de esta manera:
¿Cómo puedo hacer como la imagen de arriba (2da foto)?
Este es mi código, ¿qué hay de malo en escribir el código? :
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($0)}
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
}
}
}
}