You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:02:30