我正试图在UIStackViews中动态创建UIButtons,这些UIButtones将加载到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,它的排列子视图是按钮数组,还有一个函数生成一个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
}
最后,我想将这些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):
最终结果图像
我试着用我的逻辑来解决这个问题,但我似乎找不到为什么它只加载最后一个单元格中的整个按钮数组的答案。
此外,我是一个初学者,所以可能会有一些冗余,或者我可能没有使用最佳实践来做一些事情-请随时纠正我,非常感谢你对的帮助
swift中的类是通过引用传递的,而不是通过值传递的。UIButton
是一个类。按照目前编写代码的方式,您只创建了按钮"a"、按钮"b"和按钮"c"的一个实例。但是这些实例已经添加到多个数组中,然后这些数组用于填充多个堆栈视图。因此,按钮"a"被添加到堆栈视图"x"中,但随后被添加到栈视图"y"中,当这种情况发生时,它会从栈视图"x"中删除,因为UIView
一次只能有一个超级视图。当它被添加到堆栈视图"z"时,这种情况再次发生。您需要更改代码,以便为每个单元格实例化"a"、"b"one_answers"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
}