2016-12-28 5 views
-3

Ich habe Array [["PT"], ["GE", "DE", "PL", "BY"], ["CZ", "US"]] und ich würde es gerne in UISegmentedControl verwenden, die ich programmatisch erstellt:Convert Array von Arrays Segmente in schnellen

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

Ich sehe Fehler:

Cannot convert value of type '[String]' to expected argument type 'String?'

Es ist wahr, Aber ich brauche, dass PT wäre zuerst Segment Titel, GE..BY an zweiter Stelle usw.

+3

Die Segment Titel Strings sind, nicht Arrays. Welches Ergebnis erwartest du? Wie sollte der Titel des zweiten Segments lauten? –

+0

@MartinR Ich weiß, aber wie so 'PT' als String tun auf dem ersten Segment' GE..BY' in zweiten sein würde und etc..generate so Segmente als Graf von Arrays in –

Antwort

2

Was ist die Art der Array? Ist es [[Zeichenfolge]], dann können Sie dies tun (Spielplatz-Code):

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) 
+0

Dank, aber ich Haupt Array zählt brauchen, dass 'PT' wäre zuerst Segment,' GE..BY' an zweiter Stelle und etc..so, so Graf-Segmente als Anzahl der Arrays im Haupt-Array generieren –

+0

Dann @Nirav D beantwortet Ihre neue Frage. – bubuxu

1

Wenn Sie PT im ersten Segment wäre, GE..BY auf den zweiten und etc .. So versuchen, wie diese.

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) 
    } 
} 
+0

Danke, ich probierte Beispiel @Bubuxu und es funktioniert gut –

+0

@VadimNikolaev Willkommen Kumpel :) –

0

Eine andere Möglichkeit wäre Ihre Arrays auf die Titel auf der Karte, wie folgt aus:

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

die, für let array = [["PT"], ["GE", "DE", "PL", "BY"], [], ["CZ", "US"]] würde ["PT", "GE..BY", "CZ..US"] ergeben.

und setzen Sie sie dann in Ihrem UISegmentedControl:

titles.enumerated().forEach { 
    mySegmentControl.insertSegment(withTitle: $0.element, at: $0.offset, animated: false) 
} 
Verwandte Themen