升级到Xcode 6.3后,无法将字符串分配到UILabel。我收到了Swift编译器错误消息"' [UILabel]'没有名为' text'"在UILabel textLabel上。有什么想法来解决它吗?
import UIKit
class ViewController: UIViewController {
@IBOutlet var nameTxt: [UITextField]!
@IBOutlet var textLabel: [UILabel]!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func changeLabel(sender: UIButton) {
self.textLabel?.text = "Success"
}
}
答案 0 :(得分:2)
当我们将故事板上的标签(或其他任何内容)连接到我们的源代码时,我们会看到一个如下所示的弹出菜单:
当你点击这里的“连接”时(我弹出的所有内容都是“textLabel”类型,其他一切都是默认的),它会生成以下代码行:
@IBOutlet weak var textLabel: UILabel!
但是,“Outlet”不是将对象从界面构建器连接到源代码的唯一选项。
如果我们更改“连接”下拉列表以选择“插座集合”,如下所示:
然后生成的代码行将与您问题中的代码行完全匹配:
@IBOutlet var textLabel: [UILabel]!
我们创建了一系列标签。这在某些情况下很有用,但可能不是我们实际想要的。
为了解决这个问题,我们必须首先确保取消挂钩我们的原始连接(否则,我们将有运行时异常)。
因此,如果您返回Interface Builder并右键单击相关标签,您将收到如下所示的菜单:
注意标签如何链接到“引用插座集合”,而不是“引用插座”?这是我们需要解决的问题。因此,单击该连接的X以取消链接。现在我们可以转到源代码并删除生成的@IBOutlet
。
现在,将您的标签重新定位为常规“Outlet”而不是“Outlet Collection”,并且您的changeLabel
方法将按原样正常运行。
当您的标签正确连接为“Outlet”而不是“Outlet Collection”时,您的界面构建器右键菜单将如下所示:
(注意这个和上一个图像之间的区别。)
答案 1 :(得分:1)
此
@IBOutlet var nameTxt: [UITextField]!
@IBOutlet var textLabel: [UILabel]!
将您的商店描述为数组(方括号)。但因为它们只是简单的UI对象,所以将其更改为:
@IBOutlet var nameTxt: UITextField!
@IBOutlet var textLabel: UILabel!