2017-01-24 4 views
0

У меня есть tableView с ячейками, заполненными UIStackViews, с кнопками asposedSubviews, которые создаются с помощью нескольких функций. Вид сверху в стеке виден, а все остальные виды скрыты, кнопка в верхних видах имеет действие, а когда ее вызываемые другие представления должны переключаться между видимыми и скрытыми.Как переключить видимость организованных представлений в UIStackView, thats внутри tableViewCell swift3

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

    for title in array1 { 
     topButtonArray.append(createButton(title: title , action: "buttonPressed")) 
    } 

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

     buttonArray.append(button) 

     for title in array2 { 
      buttonArray.append(createButton(title: title, action: "moveOn")) 
     } 
     finalButtonArray.append(buttonArray) 
    } 
    return finalButtonArray 
} 


func generateStackViews() -> [UIStackView] { 
     stackViewArray = [UIStackView]() 
     let finalButtonArray = generateButtons() 

     for buttons in finalButtonArray{ 
      stackViewArray.append(createStackView(subViews: buttons)) 

     } 
     for stackView in stackViewArray{ 
      let views = stackView.arrangedSubviews 
      let hiddenViews = views[1..<views.count] 
      for views in hiddenViews{ 
      views.isHidden = true 
     } 
    } 
    return stackViewArray 
} 

func buttonPressed(){ 
    //let stackViewArray = generateStackViews() 
    for stackView in stackViewArray{ 
     let views = stackView.arrangedSubviews 
     let hiddenViews = views[1..<views.count] 
     for view in hiddenViews { 
      if view.isHidden == true{showViews(view: view)} else{hideViews(view: view)} 
     } 

    } 

} 

func showViews(view : UIView){ 
    UIView.animate(withDuration: 0.3) { 
     view.isHidden = false 
    } 

} 


func hideViews(view : UIView) { 
    UIView.animate(withDuration: 0.2) { 
     view.isHidden = true 
    } 

} 



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

    return cell 
} 

Прямо сейчас Что происходит, что только скрытые виды в последней ячейке переключаясь между видимым и скрытым (независимо от того, в какую ячейку я нажимаю) - Я думаю, мне нужно создать экземпляр переключаясь на все клетки, но я не могу выяснить способ сделать это.

Другая проблема заключается в том, что я хочу, чтобы вид сверху открывал только скрытые представления в своей ячейке, я считаю, что мне нужно использовать indexPath.row как-то вне 'cellForRowAt indexPath'.

ответ

1

Вы поблагодарите свое здравомыслие, если вы переместите эту логику в подкласс UITableViewCell.

Не полная переписывание вашего фрагмента (намекая на создание некоторых представлений через раскадровку, но не имеет большого значения для работы в коде, за исключением без раскадровки, вам также необходимо переопределить инициализацию ячейки и настроить подпункты) , но вот отправная точка, которую вы могли бы исследовать:

class StackViewCell: UITableViewCell { 

    // these could be set up in code in the `init` method if 
    // you don't want to use storyboards 
    @IBOutlet var stackView: UIStackView! 
    @IBOutlet var toggleButton: UIButton! 

    var optionButtons: [UIButton] = [] { 
     didSet { 
      for button in optionButtons { 
       button.isHidden = optionsAreHidden 
       stackView.addArrangedSubview(button) 
      } 
     } 
    } 

    // iterates over buttons to change hidden property based on `optionsAreHidden` property 
    var optionsAreHidden: Bool = true { 
     didSet { 
      optionButtons.forEach({ $0.isHidden = optionsAreHidden }) 
     } 
    } 


    @IBAction func toggleButtonPressed(button: UIButton) { 
     optionsAreHidden = !optionsAreHidden 
    } 

    // set up stackview and toggle button here if not setting up in storyboard 
    //init?(coder aDecoder: NSCoder) { } 

} 

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

Если они все одинаковые, я бы тоже переместите логику generateOptionsButtons() в StackViewCell (или, действительно, если они одинаковы для каждой ячейки, я бы, вероятно, установил их в раскадровке).

class OptionsViewController: UITableViewController { 

    func generateOptionsButtons() -> [UIButton] { 
     // create and return buttons for a cell 
     // potentially move this into `StackViewCell` too... 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "StackViewCellIdentifier", for: indexPath) 

     if let stackViewCell = cell as? StackViewCell { 
      stackViewCell.optionButtons = generateOptionsButtons() 
     } 

     return cell 
    } 
} 

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

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