如何从另一个函数更改生成的标签的文本

时间:2015-12-23 05:04:47

标签: xcode swift

所以今天我创建了我的第一个没有故事板的标签,我想知道如何在单击按钮时更改标签的文本。按钮的动作很好。我确实为标签创建了一个插座,所以我可以从我最初调用它的方法中引用它,但是当我点击按钮时应用程序崩溃。

这是我的代码:

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()

}
}

2 个答案:

答案 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>

我希望这有助于解决您的问题。