所以今天我创建了我的第一个没有故事板的标签,我想知道如何在单击按钮时更改标签的文本。按钮的动作很好。我确实为标签创建了一个插座,所以我可以从我最初调用它的方法中引用它,但是当我点击按钮时应用程序崩溃。
这是我的代码:
import UIKit
import Foundation
class ThirdViewController: UIViewController {
@IBOutlet weak var label1: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.view.addBackground()
//label one
var label1 = UILabel(frame: CGRectMake(0, 0, view.bounds.width - 80, 30))
label1.center = CGPointMake(view.bounds.width/2, 20)
label1.textAlignment = NSTextAlignment.Center
label1.text = "Pick the largest number"
label1.font = UIFont(name: font, size: 25)
self.view.addSubview(label1)
//number one
var num1 = UIButton(frame: CGRectMake(0, 0, 100, 100))
num1.center = CGPointMake(view.bounds.width/4, view.bounds.height/4)
num1.setTitle("37", forState: UIControlState.Normal)
num1.addTarget(self, action: "num1Tapped", forControlEvents: UIControlEvents.TouchUpInside)
num1.titleLabel!.font = UIFont(name: font, size: 70)
self.view.addSubview(num1)
}
func num1Tapped(UIButton!){
label1.text = "test"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
答案 0 :(得分:0)
除了一些小的改动之外,你的代码几乎是正确的:
override func viewDidLoad() {
super.viewDidLoad()
self.view.addBackground()
//label one
var label1 = UILabel(frame: CGRectMake(0, 0, view.bounds.width - 80, 30))
label1.center = CGPointMake(view.bounds.width/2, 20)
label1.textAlignment = NSTextAlignment.Center
label1.text = "Pick the largest number"
label1.font = UIFont(name: font, size: 25)
self.view.addSubview(label1)
//number one
var num1 = UIButton(frame: CGRectMake(0, 0, 100, 100))
num1.center = CGPointMake(view.bounds.width/4, view.bounds.height/4)
num1.setTitle("37", forState: UIControlState.Normal)
num1.addTarget(self, action: "num1Tapped:", forControlEvents: UIControlEvents.TouchUpInside)
num1.titleLabel!.font = UIFont(name: font, size: 70)
self.view.addSubview(num1)
}
func num1Tapped(sender: UIButton!){
label1.text = "test"
}
@ user2893289是正确的,@ Arc676也是如此。您需要在操作中添加“:”并添加sender: UIButton!
作为按钮操作。
答案 1 :(得分:0)
您的代码存在一些问题。
您在类定义@IBOutlet weak var label1: UILabel!
之上定义的属性与您在方法viewDidLoad()
中(内部)定义的属性不同。
在这里,您将创建一个新的局部变量,其属性名称与实例变量相同!
您创建的这个变量只能在方法内部访问,它是定义它的范围。
方法num1Tapped(_:)
正如此处所述,未正确定义。
由UIControl
触发的操作可以有三种不同的签名:
action()
action(_:)
action(_: forEvent:)
如果您不需要按钮的引用和/或触发操作的事件,您可以使用第一个。
就像现在一样,忘记错误的定义,当调用方法num1Tapped(_:)
时,它将尝试访问实例变量label1
,而不是方法{{1}中定义的局部变量顺便说一下,这是不可能做到的。
因此,接下来要解决的是此实例变量viewDidLoad()
。
如您所定义,您必须将此声明与故事板中的Outlet连接,或者您必须手动初始化变量。
这是我使用的示例中的代码(经过一些修改),以便在触摸按钮时更改标签,并假设您使用代码创建标签:
label1
一些额外的笔记。
使用您提供的代码,我不明白它如何使用方法class ThirdViewController: UIViewController {
var label1: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//label one
label1 = UILabel(frame: CGRectMake(0, 0, view.bounds.width - 80, 30))
label1.center = CGPointMake(view.bounds.width/2, 20)
label1.textAlignment = NSTextAlignment.Center
label1.text = "Pick the largest number"
// label1.font = UIFont(name: font, size: 25)
view.addSubview(label1)
//number one
// let num1 = UIButton(frame: CGRectMake(0, 0, 100, 100))
let num1 = UIButton(type: .System)
num1.frame = CGRectMake(0, 0, 100, 100)
print("num1: \(num1)")
num1.center = CGPointMake(self.view.bounds.width/4, self.view.bounds.height/4)
num1.setTitle("37", forState: UIControlState.Normal)
num1.addTarget(self, action: "num1Tapped", forControlEvents: UIControlEvents.TouchUpInside)
// num1.addTarget(self, action: "num1TappedWithParameter:", forControlEvents: UIControlEvents.TouchUpInside)
// num1.addTarget(self, action: "num1TappedWithTwoParameters:event:", forControlEvents: UIControlEvents.TouchUpInside)
// num1.titleLabel!.font = UIFont(name: font, size: 70)
self.view.addSubview(num1)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func num1Tapped() {
label1.text = "test"
}
func num1TappedWithParameter(sender: UIButton){
label1.text = "test"
}
func num1TappedWithTwoParameters(sender: UIButton, event: UIEvent) {
print("button: \(sender.description) event: \(event)")
}
}
的错误签名进行编译。这不编译!
你有没有(使用Xcode建议)改为num1Tapped(UIButton!)
?
如果你这样做,应用程序崩溃,因为它可以找到你正在调用的方法,因为你定义它没有参数:
num1Tapped(_ :UIButton!)
我不明白的另一件事是你的按钮是如何显示的,因为它没有设置它的类型。
您是否在故事板中定义了按钮num1.addTarget(self, action: "num1Tapped", forControlEvents: UIControlEvents.TouchUpInside)
,而您(错误地)尝试在代码中访问此处?
num1
已被评论,因为它未在此处定义。
设置字体时会发生同样的情况。
我添加了两个方法,以便您了解如何使用它们。
编写代码时要保持一致。如果您在没有addBackground()
的情况下访问变量view
,请在添加子视图时执行相同操作:self
,当然,相反,在两种情况下都使用view.addSubview(num1)
。< / p>
我希望这有助于解决您的问题。