在Xcode Swift中使用双循环创建多行列表格是否可行?
用嵌套for循环实现固定行列的UITextField表格可行吗?
当然试过这种实现方式啦!用嵌套for循环来生成固定行列的文本输入单元格是完全可行的,而且是这类简单需求里非常直接高效的思路。
先给你吃个定心丸:你的思路没问题
这种通过遍历行列、逐个计算每个单元格frame的方式,逻辑清晰易懂,对于固定行列的场景来说,不需要引入复杂的布局框架(比如Auto Layout或者UICollectionView),就能快速搭建出你想要的表格结构。
聊聊代码里可以优化的小细节
不过看你的代码,有几个小地方可以调整得更顺手:
- UITextView vs UITextField:你问题里说要UITextField,但代码里用的是UITextView——如果是笔误的话要注意,前者是单行输入控件,后者是多行,根据你的实际需求替换就行。
- 类型统一:计算frame时尽量用
CGFloat而非Double,因为UIKit的布局数值都是CGFloat类型,避免不必要的类型转换。 - Tag的唯一性:你用
"\(col)\(row)"转整数当tag的方式,在行列数较多时可能会出现冲突(比如col=12、row=3 和 col=1、row=23的tag都是123),可以改成tag = (row - 1) * columns + col,这样每个单元格的tag都是唯一的,后续通过tag查找控件会更可靠。 - 屏幕适配:如果需要支持横竖屏或者不同尺寸的设备,纯frame的方式需要在
viewWillLayoutSubviews方法里重新计算布局,不然单元格不会自动调整大小和位置。
调整后的示例代码(换成UITextField)
let columns = 7 let rows = 12 let contentWidth = contentView.bounds.width let contentHeight = contentView.bounds.height // 假设你的cellColour是根据文本返回颜色的逻辑 let cellColour: (String?) -> UIColor = { text in return text?.isEmpty ?? true ? .white : .lightGray } for col in 1...columns { for row in 1...rows { let cellWidth = contentWidth / CGFloat(columns) let cellHeight = contentHeight / CGFloat(rows) let x = CGFloat(col - 1) * cellWidth let y = CGFloat(row - 1) * cellHeight let textField = UITextField(frame: CGRect(x: x, y: y, width: cellWidth, height: cellHeight)) // 优化后的唯一tag textField.tag = (row - 1) * columns + col textField.backgroundColor = cellColour(textField.text) textField.layer.borderColor = UIColor.lightGray.cgColor textField.font = UIFont(name: "AvenirNext-Regular", size: 15) textField.textAlignment = .center textField.layer.borderWidth = 1 textField.delegate = self contentView.addSubview(textField) } }
额外补充
如果后续你的需求有变化(比如行列数需要动态调整、需要复用单元格优化性能),那UICollectionView会是更好的选择;但对于固定行列的简单场景,嵌套循环的方式足够轻量,完全能满足需求。
内容的提问来源于stack exchange,提问作者user5126575
相关产品推荐
相关产品推荐

