如何将 stackViews 添加到 UITableViewCell?

Posted

技术标签:

【中文标题】如何将 stackViews 添加到 UITableViewCell?【英文标题】:how to add stackViews to UITableViewCell? 【发布时间】:2017-01-18 17:38:32 【问题描述】:

我正在尝试在 UIStackViews 中动态创建 UIButtons,它将加载到 TableViewCell 中。

我有两个保存字符串值的数组:

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

我有一个创建 UIButton 的函数,以及一个生成 UIButton 数组数组的函数,该数组包含来自“array_1”的一个值以及来自“array_2”的所有值(即:[[a,x,y,z ], [b,x,y,z], [c,x,y,z]])

    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,其排列的子视图是按钮数组,以及一个生成 UIStackViews 数组的函数,该数组用按钮保存这些 stackViews

    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 个单元格(正如我想要的那样) 但在第一个和第二个单元格中,我只能看到第一个按钮(即:a/b),但在第三个单元格中,我得到了我想要发生的事情(即:a、x、y、z):

finalResultImage

我尝试用我的逻辑找出问题,但我似乎找不到答案,为什么它只在最后一个单元格中加载整个按钮数组。

另外,我是初学者,所以可能会有一些冗余,或者我可能没有对某些内容使用最佳实践 - 请随时纠正我,非常感谢您的帮助

【问题讨论】:

【参考方案1】:

swift 中的类是按引用传递而不是按值传递。 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

【讨论】:

以上是关于如何将 stackViews 添加到 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用for循环将按钮添加到stackview?

如何将子视图添加到我的 stackView?我试试看,但我看不到它们

如何以编程方式将自定义 UIView 添加到 UIScrollView 之上的 Stackview?

在 Swift 中以编程方式将视图添加到 stackview

如何将一组 UIButtons 添加到 UIStackview 上?

如何从 XIB 文件加载自定义创建的视图并添加到 StackView