UIButton矩阵无法正确显示,寻求9x9按钮矩阵代码问题排查
问题分析与修复方案
嘿,我一眼就看到代码里的小坑啦——这也是while循环很容易踩的典型问题!
核心问题:内层循环变量未重置
你把y的初始化放在了外层循环外面,第一次执行外层循环(x=0)时,y从0递增到9,循环结束后y的值变成了10。之后当x从1到9时,内层循环的条件y<10再也不满足,所以后面的行根本不会创建按钮,自然只能看到第一行。
另外还有个小细节:你原本想要的是9x9矩阵,但代码里的循环条件是x<10和y<10,这会生成10x10的按钮,这点也得调整~
修复后的代码(标准9x9版本)
我们只需要把y的声明移到外层循环内部,确保每次x递增时y都从0重新开始,同时修正循环条件:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. var x = 0 while(x<9){ var y = 0 // 每次x切换行时,y重置为0 while(y<9){ let button = UIButton(frame: CGRect(x: (x+1)*50, y: (y+1)*50, width: 50, height: 50)) button.backgroundColor = .green button.setTitle("(" + String(x) + ", " + String(y) + ")", for: .normal) button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) self.view.addSubview(button) y+=1 } x+=1 } } @objc func buttonAction(sender: UIButton!) { print("Button " + sender.title(for: .normal)! + " tapped") } }
更清爽的优化写法:用for-in循环
在Swift里,固定次数的遍历用for-in循环更直观,还能避免这类变量重置的问题,同时用字符串插值让代码更简洁:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 遍历0到8,生成9x9的按钮矩阵 for x in 0..<9 { for y in 0..<9 { let button = UIButton(frame: CGRect(x: (x+1)*50, y: (y+1)*50, width: 50, height: 50)) button.backgroundColor = .green button.setTitle("(\(x), \(y))", for: .normal) // 字符串插值替代拼接,更清爽 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside) view.addSubview(button) } } } @objc func buttonAction(sender: UIButton!) { print("Button \(sender.title(for: .normal)!) tapped") } }
这样修改后,9x9的按钮矩阵就能正常显示啦,点击每个按钮也会正确打印对应的坐标~
内容的提问来源于stack exchange,提问作者user12473575
相关产品推荐
相关产品推荐

