2016-12-28 2 views
-3

У меня есть массив [["PT"], ["GE", "DE", "PL", "BY"], ["CZ", "US"]], и я хотел бы использовать его в UISegmentedControl, который я создал программно:Преобразовать массив массивов сегментов в быстрой

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

Я вижу ошибку:

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

Это правда , Но мне нужно, чтобы PT был в заголовке первого сегмента, GE..BY на втором и т. Д.

+3

Названия сегментов являются строками, а не массивы. Какой результат вы ожидаете? Каким должно быть название второго сегмента? –

+0

@MartinR Я знаю, но как это сделать «PT», поскольку String будет на первом сегменте, «GE..BY» на секунду и т. Д., Выровняйте так, чтобы подсчитывать сегменты как количество массивов в основном массиве –

ответ

2

Какой тип массива? Является ли это [[String]], то вы можете сделать это (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) 
+0

спасибо, но я необходимо, чтобы 'PT' был на первом сегменте,' GE..BY' на секунду и т. д., так генерировать так счет сегментов, как количество массивов в основном массиве –

+0

Тогда @Nirav D ответил на ваш новый вопрос. – bubuxu

1

Если вы хотите PT бы в первом сегменте, GE..BY на втором и т.д .. Так что попробуйте, как это.

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

спасибо, я попробовал пример @bubuxu, и он работает хорошо –

+0

@VadimNikolaev Welcome mate :) –

0

Другим способом было бы сопоставить массивы названий, например:

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

который для let array = [["PT"], ["GE", "DE", "PL", "BY"], [], ["CZ", "US"]] даст ["PT", "GE..BY", "CZ..US"].

А затем вставить ее в UISegmentedControl:

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

 Смежные вопросы

  • Нет связанных вопросов^_^