0

ここに、アラートビューを実行し、件名を尋ねるテキストフィールドを表示するこのコードがあります

 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 = ""

しかし問題は、アプリを実行してアラートビューを表示するボタンをクリックし、件名を入力して[OK]をクリックすると、文字列を出力しようとするとこのエラーが発生することです。このエラーを出力するだけで、アプリを閉じません

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

items入力したテキストがエラーに表示されますが、配列を印刷 すると印刷されるため、変数に追加されません

[English, ]

そしてそうではない

[English, irish]
4

1 に答える 1

0

これは奇妙です...

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

var textfself.textf2 つの異なる変数です。self.textf関数の外で設定した空の文字列のようです。したがって、空の文字列がitems配列に追加されます。

また、別の問題があります。文字列が必要なようですが、var textf値はUITextField. text文字列が必要な場合は、プロパティを引っ掛ける必要があります。

この混乱が、私が明示的な型付けを好む理由です。を期待していてStringUITextField変数を明示的に入力すると、コンパイラはそれをキャッチします。

つまり、次のようなものがもっと必要です。

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()
    }))
}
于 2014-09-03T19:33:38.190 に答える