2017-01-18 2 views
1

Я пытаюсь динамически создавать UIButtons внутри UIStackViews, которые будут загружаться в TableViewCell.Как добавить stackViews в UITableViewCell?

у меня есть два массива, которые держат значения Строка:

array_1 = ["a" , "b" , "c"] 
array_2 = ["x" , "y" , "z"] 

я есть функция, которая создает UIButton и функцию, которая генерирует массив UIButton массивов, который содержит одно значение из «array_1» плюс все значения от 'array_2' (то есть: [[а, х, у, г], [Ь, х, у, г], [с, х, у, г]])

func createButton(title : String) -> UIButton { 
    let newButton = UIButton(type: .system) 
    newButton.setTitle(title, for: .normal) 
    newButton.backgroundColor = UIColor.lightGray 
    return newButton 
} 

    func generateButtons() -> [[UIButton]]{ 
    var topButtonArray = [UIButton]() 
    var buttomButtonArray = [UIButton]() 
    var finalButtonArray = [[UIButton]]() 

    for title in array_1 { 
     topButtonArray += [createButton(title: title)] 
    } 
    for title in array_2 { 
     buttomButtonArray += [createButton(title: title)] 
    } 

    for button in topButtonArray { 
     finalButtonArray += [[button]+buttomButtonArray] 
    } 

    return finalButtonArray 
} 

теперь у меня есть функция, которая создает UIStackView, которые его организованные subviews представляют собой массивы кнопок, и тот, который генерирует массив UIStackViews, которые содержат эти стеке с кнопками

func createStackView(subViews : [UIButton]) -> UIStackView{ 
    let stackView = UIStackView(arrangedSubviews: subViews) 
    stackView.axis = .vertical 
    stackView.distribution = .fillEqually 
    stackView.alignment = .fill 
    stackView.translatesAutoresizingMaskIntoConstraints = false 
    stackView.spacing = 5 
    return stackView 
} 


    func generateStackViewArray() -> [UIStackView] { 
    var stackViewArray = [UIStackView]() 
    let finalButtonArray = generateButtons() 
    for buttons in finalButtonArray{ 
     stackViewArray += [createStackView(subViews: buttons)] 
    } 
    return stackViewArray 
} 

наконец, я хочу, чтобы загрузить эти UIStackViews в отдельные UITableViewCells

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return array_1.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "First")! 
    cell.contentView.addSubview(generateStackViewArray([indexPath.row]) 
    return cell 
} 

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    let screenSize : CGRect = UIScreen.main.bounds 
    let screenHeight = screenSize.height 
    let relativeCellSizeDefault = screenHeight/CGFloat (array_1.count) 

    return relativeCellSizeDefault 
} 

сейчас мой конечный результат является UITableView, с 3-х клеток (так же, как я хочу) , но в первой и второй клетка я могу видеть только первую кнопку (то есть: а/б), а в третьей ячейке я получить то, что я хочу, чтобы это произошло (то есть: а, х, у, г):

finalResultImage

Я попытался выяснить проблему с моей логикой, но я не могу найти ответ, почему он загружает весь массив кнопок в последней ячейке.

также, я новичок, так что может быть некоторая избыточность или я не мог бы использовать наилучшую практику для некоторых вещей - не стесняйтесь исправлять меня и большое спасибо за помощь

ответ

1

Классы в стрижа могут пройти по ссылка не проходит по значению. UIButton - класс. Так как ваш код написан в настоящее время, вы создаете только один экземпляр кнопки «a», кнопку «b» и кнопку «c». Но эти экземпляры были добавлены в несколько массивов, которые затем используются для заполнения нескольких представлений стека. Таким образом, кнопка «a» добавляется в представление стека «x», но затем добавляется в представление стека «y», когда это происходит, оно удаляется из представления стека «x», потому что UIView может иметь только один супер-просмотр за раз. Это происходит снова, когда оно добавляется в представление стека «z». Вам нужно изменить свой код, чтобы вы создавали новые экземпляры для кнопок «a», «b» и «c» для каждой ячейки. Что-то вроде:

func generateButtons() -> [[UIButton]] 
{ 
    var topButtonArray = [UIButton]() 
    var finalButtonArray = [[UIButton]]() 

    for title in array_1 
    { 
     topButtonArray.append(createButton(title: title)) 
    } 

    for button in topButtonArray 
    { 
     var buttonArray = [UIButton]() 
     buttonArray.append(button) 

     for title in array_2 
     { 
      buttonArray.append(createButton(title: title)) 
     } 
     finalButtonArray.append(buttonArray) 
    } 

    return finalButtonArray 
} 
Смежные вопросы