Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将StackView添加到UITableViewCell?_Ios_Swift_Uitableview_Uibutton_Uistackview - Fatal编程技术网

Ios 如何将StackView添加到UITableViewCell?

Ios 如何将StackView添加到UITableViewCell?,ios,swift,uitableview,uibutton,uistackview,Ios,Swift,Uitableview,Uibutton,Uistackview,我正在尝试在UIStackView中动态创建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]) 现在我有一个函数,它创建了一个U

我正在尝试在UIStackView中动态创建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])

现在我有一个函数,它创建了一个UIStackView,其中排列的子视图是按钮数组,还有一个函数生成了一个UIStackView数组,其中包含了带有按钮的堆栈视图

    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
}
最后,我想将这些UIStackView加载到各个UITableViewCell中

    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):

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


另外,我是一个初学者,因此可能会有一些冗余,或者我可能没有对某些内容使用最佳实践-请随时纠正我,非常感谢您帮助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
}
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
}