2017-01-24 1 views
0

Ich habe ein tableview mit durch UIStackViews bevölkerten Zellen, mit Tasten als arrangedSubviews, die mit einigen Funktionen erstellt werden. Die Draufsicht in der stackView ist sichtbar und alle anderen Ansichten sind versteckt, die Taste in dem Draufsichten eine Wirkung hat, und wenn sein die anderen Ansichten genannt sollten zwischen sichtbaren und verborgenen wechseln.wie man Sichtbarkeit von arrangedSubviews in einem UIStackView zu wechseln, das ist innerhalb eines 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 
} 

Gerade jetzt was ist passiert, dass nur die verborgenen Ansichten in der letzten Zelle zwischen sichtbar und versteckt sind Makel (egal welche Zelle i klicken) - Ich denke, ich brauche die Hin- und Herschalten auf allen Zellen instanziiert, aber ich kippe finde einen Weg, das zu tun.

ein anderes Problem ist, dass ich möchte, dass eine Draufsicht nur die versteckten Ansichten in seiner Zelle öffnen, ich denke, ich brauche indexPath.row irgendwie außerhalb von 'CellForRowAt indexPath'.

Antwort

1

Sie werden Ihre geistige Gesundheit danken, wenn Sie viele dieser Logik in eine UITableViewCell Unterklasse verschieben.

Kein vollständiges Neuschreiben Ihres Snippets (Hinweis darauf, einige der Ansichten über Storyboard einzurichten, aber kein großer Unterschied zu Code, außer ohne Storyboard müssen Sie auch die Init der Zelle überschreiben und die Subviews einrichten) , aber hier ist ein Ausgangspunkt, die Sie untersuchen können:

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) { } 

} 

Dann wird die view-Controller viel einfacher wird. Es ist mir nicht klar, ob die Stack-Ansicht in jeder Zelle die gleichen Optionsschaltflächen enthält oder ob die Optionsfelder irgendwie kontextabhängig sind.

Wenn sie alle gleich sind, würde ich auch verschiebe die generateOptionsButtons() Logik in die (oder eigentlich, wenn sie für jede Zelle gleich sind, würde ich sie wahrscheinlich im Storyboard einrichten).

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 
    } 
} 
Verwandte Themen