Tengo la matriz [["PT"], ["GE", "DE", "PL", "BY"], ["CZ", "US"]] y me gustaría usarla en UISegmentedControl que creé mediante programación:

 for i in 0..<array.count {
            mySegmentControl.insertSegment(withTitle: array[i], at: i, animated: false)
        }

Veo error:

No se puede convertir el valor del tipo '[Cadena]' al tipo de argumento esperado 'Cadena?'

Es cierto, pero necesito que PT esté en el título del primer segmento, GE..BY en el segundo y etc.

-3
Vadim Nikolaev 28 dic. 2016 a las 15:01

3 respuestas

La mejor respuesta

¿Cuál es el tipo de matriz? ¿Es [[String]], entonces puedes hacer esto (código de Playground):

extension UISegmentedControl {

    func updateTitle(array titles: [[String]]) {

        removeAllSegments()
        for t in titles {
            let title = t.joined(separator: ", ")
            insertSegment(withTitle: title, at: numberOfSegments, animated: true)
        }

    }
}

let control = UISegmentedControl()
control.updateTitle(array: [["PT"], ["GE", "DE", "PL", "BY"], ["CZ", "US"]])
control.titleForSegment(at: 1)
2
bubuxu 28 dic. 2016 a las 12:06

Otra forma sería asignar sus matrices a los títulos, así:

let titles: [String] = array.flatMap {
    guard let first = $0.first else { return nil }
    return first + ($0.count > 1 ? (".." + $0.last!) : "")
}

Que, para let array = [["PT"], ["GE", "DE", "PL", "BY"], [], ["CZ", "US"]] produciría ["PT", "GE..BY", "CZ..US"].

Y luego insértelo en su UISegmentedControl:

titles.enumerated().forEach {
    mySegmentControl.insertSegment(withTitle: $0.element, at: $0.offset, animated: false)
}
0
Daniel 28 dic. 2016 a las 13:28

Si desea PT estaría en el primer segmento, GE..BY en el segundo y etc. Así que intente así.

for (index,subArray) in array.enumerated() {
     if subArray.count > 1 {
          let title = subArray.first! + ".." + subArray.last!
          mySegmentControl.insertSegment(withTitle: title, at: index, animated: false)
     }
     else if subArray.count > 0 {
          let title = subArray.first!
          mySegmentControl.insertSegment(withTitle: title, at: index, animated: false)
     }
}
1
Nirav D 28 dic. 2016 a las 12:16