尝试从警报视图文本字段打印变量时出现Swift错误

时间:2014-09-01 19:30:59

标签: variables swift alertview

我这里有这个代码,它运行一个alertview并显示一个文本字段,询问主题名称

 alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler:{ (alertAction:UIAlertAction!) in
            var textf= alertController.textFields[0] as UITextField
            self.items += [self.textf]
            println(self.items)
            println(textf)
            self.view .setNeedsDisplay()

        }))

然后我使用此代码在代码顶部从该函数声明变量items和textf

var items = ["English"]
let textf = ""

但问题是,当我运行我的应用程序并单击显示alertview的按钮并输入我的主题并单击确定时,我在尝试打印字符串时出现此错误。它只是打印出这个错误,它不会关闭我的应用程序

<_UIAlertControllerTextField: 0x7f9d22d1c430; frame = (4 4; 229 16); text = 'irish'; clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0x7f9d22cc55f0>; layer = <CALayer: 0x7f9d22d1c6e0>>

它在错误中输入了我输入的文本,但它没有将它添加到变量中,因为当我打印出数组items时,它打印出来

[English, ]

而不是

[English, irish]

1 个答案:

答案 0 :(得分:0)

这很奇怪......

var textf= alertController.textFields[0] as UITextField
self.items += [self.textf]

var textfself.textf两个不同的变量。看起来self.textf是您在函数外部设置的空字符串。因此,空字符串会添加到items数组中。

您还有另一个问题。您似乎想要一个字符串,但您的var textf值是UITextField。如果你想要字符串,你需要抓住text属性。

这种混淆是我喜欢显式打字的原因。如果您期望String并且UITextField,则编译器会在您明确键入变量时捕获它。

这意味着你需要更像这样的东西:

var items: [String] = ["English"]
var textf: UITextField? = nil // this variable optionally holds a text field

// later, inside some function...
func somefunc() {
    alertController.addAction(UIAlertAction(title: "Ok", style: .Default, handler:{ (alertAction:UIAlertAction!) in
        self.textf = alertController.textFields[0] as UITextField
        // append() is preferable to += [], no need for a temporary array
        self.items.append(self.textf!.text)
        println(self.items)
        println(textf)
        self.view.setNeedsDisplay()
    }))
}