如何在 UIStackView 中切换排列子视图的可见性,这在 tableViewCell swift3 中

Posted

技术标签:

【中文标题】如何在 UIStackView 中切换排列子视图的可见性,这在 tableViewCell swift3 中【英文标题】:how to to toggle visibility of arrangedSubviews in a UIStackView, thats inside a tableViewCell swift3 【发布时间】:2017-01-24 20:22:52 【问题描述】:

我有一个表格视图,其中的单元格由 UIStackViews 填充,按钮为排列子视图,由几个函数创建。 stackView 中的顶视图是可见的,所有其他视图都是隐藏的,顶视图中的按钮有一个动作,当它被调用时,其他视图应该在可见和隐藏之间切换。

    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 == trueshowViews(view: view) elsehideViews(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

现在发生的事情是只有最后一个单元格中的隐藏视图在可见和隐藏之间切换(无论我点击哪个单元格) - 我想我需要实例化所有单元格上的切换但我想不出办法这样做。

另一个问题是我希望顶视图只打开其单元格中的隐藏视图,我认为我需要在“cellForRowAt indexPath”之外以某种方式使用 indexPath.row。

【问题讨论】:

【参考方案1】:

如果您将大量此类逻辑移到 UITableViewCell 子类中,您会感谢您的理智。

不是对你的 sn-p 的完全重写(暗示通过情节提要设置一些视图,但除了没有情节提要之外,在代码中没有大的区别,你还需要覆盖单元格的初始化并设置子视图),但这是您可以调查的起点:

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
    

【讨论】:

以上是关于如何在 UIStackView 中切换排列子视图的可见性,这在 tableViewCell swift3 中的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView - 三个具有相对宽度的排列子视图

Swift 将 GestureRecognizer 添加到 UIStackView 之上的 View

Swift iOS - 如何排列子层位置以匹配按钮文本的中心

如何在 `UIStackView` 中排列视图?

替换 UIStackView 中的视图

使用java排列子节点