我正在尝试在UIStackViews中动态创建将加载到TableViewCell中的UIButtons。
我有两个包含String值的数组:
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
}
最后,我想将这些UIStackView加载到单独的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):
我尝试用我的逻辑解决问题,但我似乎找不到为什么它只在最后一个单元格中加载整个按钮数组的答案。
另外,我是初学者,所以可能会有一些冗余,或者我可能没有使用最佳实践来解决某些问题 - 随意纠正我并非常感谢你的帮助
答案 0 :(得分:1)
swift中的类是通过引用传递而不是通过值传递。 UIButton
是一个班级。目前编写代码的方式只是创建了一个按钮"",按钮" 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
}