问题描述
大约十年前我有一个应用程序,但我没有更新。我最近找到了代码,并试图用 Swift 将它带入 Xcode。我的故事板状态良好,并且开始编写可运行的代码,但我无法成功地将旧方法翻译成新语言。
该应用程序将具有需要填充数组的编号 UIButton。标签将按照用户作为 IBAction 输入的顺序收集 Array 项目。标签一 (Aa) 将需要包括索引 0 处的数组项,索引 1 处的标签二 (Ab) 等
据我所知,我遇到了麻烦,让标签名称进入数组并提取该信息。我知道这是一个简单的问题,但自从我编码并希望让我的应用再次运行已经 7 年了!
代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var rowAsEntered: UILabel!
@IBOutlet weak var Aa: UILabel!
var primeRow = [Int]()
override func viewDidLoad() {
super.viewDidLoad()
clearAll() }
func clearAll()
{
rowAsEntered.text = ""
primeRow.removeAll()
Aa.text = ""
Ab.text = ""
Ac.text = ""
Ad.text = ""
Ae.text = ""
Af.text = ""
Ag.text = ""
Ah.text = ""
Ai.text = ""
Aj.text = ""
Ak.text = ""
Al.text = ""
}
@IBAction func backTap(_ sender: Any) {
if(!row.isEmpty)
{
primeRow.removeLast()
}
}
@IBAction func clearTap(_ sender: Any) {
clearAll() }
func addToPrimeRow(value: Array<Int>){
Aa.text = primeRow [0]
Ab.text = primeRow [1]
Ac.text = primeRow [2]
Ad.text = primeRow [3]
Ae.text = primeRow [4]
Af.text = primeRow [5]
Ag.text = primeRow [6]
Ah.text = primeRow [7]
Ai.text = primeRow [8]
Aj.text = primeRow [9]
Ak.text = primeRow [10]
Al.text = primeRow [11]
}
@IBAction func zeroTap(_ sender: Any){
addToPrimeRow.append(0)
}
@IBAction func oneTap(_ sender: Any) {
addToPrimeRow.append(1)
}
@IBAction func twoTap(_ sender: Any) {
addToPrimeRow.append(2)}
@IBAction func threeTap(_ sender: Any) {
addToPrimeRow.append(3)
}
@IBAction func fourTap(_ sender: Any) {
addToPrimeRow.append(4)
}
@IBAction func fiveTap(_ sender: Any) {
addToPrimeRow.append(5)
}
@IBAction func sixTap(_ sender: Any) {
addToPrimeRow.append(6)
}
@IBAction func sevenTap(_ sender: Any) {
addToPrimeRow.append(7)
}
@IBAction func eightTap(_ sender: Any) {
addToPrimeRow.append(8)
}
@IBAction func nineTap(_ sender: Any) {
addToPrimeRow.append(9)
}
@IBAction func tenTap(_ sender: Any) {
addToPrimeRow.append(10)
}
@IBAction func elevenTap(_ sender: Any) {
addToPrimeRow.append(11)
}
}
解决方法
-
我建议您使用一系列按钮/标签。然后,您可以使用带有 switch 语句的单数
func tapped(_ sender: Any)
来根据按钮的索引处理操作。 (在此处查看瓦迪安对这篇文章的回答:Array of UIButtons) -
addToPrimeRow.append()
对您不起作用,因为addToPrimeRow
被声明为函数。append
用于数组数据结构。 -
您试图将一个 Int 分配给需要字符串的
label.text
。这是一个简单的解决方法,只需将其投射String(Int)
。
有了上面的,它看起来像这样:
@IBOutlet var buttons: [UIButton]!
@IBOutlet var labels: [UILabel]!
@IBAction func tappedButton(_ sender: UIButton) {
guard let index = boxes.index(of: sender) else { return }
updateLabel(at: index,to: String(index))
}
// added a second param newText to updateLabel in case you want
// to update the label text to something other than the index
// if you don't want to do that,you can just cast the index
// to a string doing String(index) inside of updateLabel and remove the second param
func updateLabel(at index: Int,to newText: String) {
guard let updatingLabel = labels[index] else { return }
updatingLabel.text = newText
}
更新
根据评论中的其他上下文,我修改了原始答案中的一些代码。
期望的行为:点击按钮将按照点击的顺序使用点击的按钮值填充标签
@IBOutlet var buttons: [UIButton]!
@IBOutlet var labels: [UILabel]!
@IBAction func tappedButton(_ sender: UIButton) {
guard let index = boxes.index(of: sender) else { return }
updateNextLabel(withValue: index)
}
func updateNextLabel(withValue value: Int) {
// find the next label that doesn't have text yet
let nextLabel = labels.first(where: {$0.text.isEmpty})
// you need to cast the int value to a string to assign it to the label
nextLabel.text = String(value)
}