質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

4回答

3529閲覧

アラートが表示されない

A2wwM

総合スコア44

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/04/05 05:54

###前提・実現したいこと
今、簡単な割り勘アプリ(合計金額/人数を結果ラベルに表示)を作っています。
そのアプリの機能の一つとして、金額あるいは人数のどちらかが空白だとアラートが表示される
###発生している問題・エラーメッセージ

アラートが表示されない。

###該当のソースコード

import UIKit //delegateの宣言 class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var resultLabel: UILabel! @IBOutlet weak var priceTextField: UITextField! @IBOutlet weak var numberTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() //delegateの所在をかく priceTextField.delegate = self numberTextField.delegate = self //各TextFieldに入力できるのは数字だけ self.priceTextField.keyboardType = UIKeyboardType.numberPad self.numberTextField.keyboardType = UIKeyboardType.numberPad } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } //ボタンを押した時 @IBAction func resultButton(_ sender: Any) { if priceTextField.text == nil || numberTextField.text == nil { //UIAlertControllerインスタンスの作成 let alertController = UIAlertController(title: "エラー", message: "合計金額又は、人数が未入力です", preferredStyle: .alert) //追加するアクションの設定 let ryoukaiAction = UIAlertAction(title: "了解", style: .default, handler: nil) //設定したアラートアクションをUIAlertControllerに追加する alertController.addAction(ryoukaiAction) //アラートを表示 present(alertController, animated: true, completion: nil) } else { guard let pricetext = priceTextField?.text, let price = Int(pricetext) else { return } guard let numbertext = numberTextField?.text, let number = Int(numbertext) else { return } let result:Double = Double(price/number) resultLabel.text = String(result) } } //delegateメソッド override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //キーボード以外のところをタップするとキーボードを閉じる if priceTextField.isFirstResponder { priceTextField.resignFirstResponder() } //キーボード以外のところをタップするとキーボードを閉じる if numberTextField.isFirstResponder{ numberTextField.resignFirstResponder() } } }

###補足情報(言語/FW/ツール等のバージョンなど)
swift3.0
xcode8.2.1
macOS Sierra(バージョン 10.12)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

if priceTextField.text == nil || numberTextField.text == nil {
でブレークポイントを設定し、値を確認してください。
nilではなく""(長さ0の文字列)になっていませんか?

if priceTextField.text?.characters.count == 0 || numberTextField.text?.characters.count == 0 { }

のようにテキスト長で判定すれば良いと思います。

投稿2017/04/05 06:26

sha

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/04/05 06:31

.textがnilのときにif文の中に入りません。 Objective-Cの場合はこれでOKなのでラクなのですが。
sha

2017/04/05 06:38 編集

UITextFiledがIBoutletだしこれで良いと思いました。 同様の質問のようにされるのが良いと思います。
A2wwM

2017/04/05 07:29

ありがとうございました。 同様の質問も参考にさせていただきました!
A2wwM

2017/04/05 10:18

ちなみに、ブレークポイントを置いて値を確認してみました。 ブレークポイントはあまり使ったことがなかったのでお伺いしたいのですが ブレークポイントを設定してみたところ、numbertext(値を設定していない)の横に "" と書かれていました。 これが、shaさんのおっしゃっている「長さ0の文字列を持っている」ということなのでしょうか?
sha

2017/04/05 10:30 編集

ブレークポイントをどこに置いたのかがわかりませんが http://qiita.com/Kta-M/items/b8f6f74b3288611e7536 を参考にUITextFieldのtextプロパティ値を直接確認すると良いと思います。 条件の位置にブレークポイントを設定するとnumbertextは長さ0の文字列も持っていない状態です。 ブレークポイントの位置によりますが、numbertext(値を設定していない)の横に 「 = (String)""」 と書かれていたのであれば「長さ0の文字列を持っている」状態です。
A2wwM

2017/04/05 11:12

丁寧に教えてくださってありがとうございます。 こちらのリンク先も見させて頂きます!
guest

0

投稿2017/04/05 06:24

xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A2wwM

2017/04/05 07:26

ありがとうございます。拝見させていただきました。 たぶん私と作っているものが同じですね! 自分とは違う書き方なので参考になります。
guest

0

swift

1if priceTextField.text == nil || numberTextField.text == nil {

このif文の中には入っているでしょうか?
カラ文字列のときにもアラートを表示させたいのであればカラ文字列チェックを行って下さい。

投稿2017/04/05 06:16

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A2wwM

2017/04/05 07:25

そもそもnil(値がない)とカラ文字列で違いがあるのですね。。。とりあえず調べてみます。
A2wwM

2017/04/05 07:25

ありがとうございます。
guest

0

ベストアンサー

ここじゃない?

swift

1 //if priceTextField.text == nil || numberTextField.text == nil { 2 3 if priceTextField.text == "" || numberTextField.text == "" { 4

投稿2017/04/05 06:10

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/04/05 06:19

これだとnilのときに入らないですね。
fuzzball

2017/04/05 06:25

if (priceTextField.text ?? "").isEmpty || (numberTextField.text ?? "").isEmpty { これで。
fromageblanc

2017/04/05 06:29

おーgoodです! 実行されないコードがあるならまずは条件のところをチェックしてほしいですね
A2wwM

2017/04/05 07:21

ありがとうございます! if (priceTextField.text ?? "").isEmpty || (numberTextField.text ?? "").isEmpty { で解決できました。 ただ一つわからないことがありまして、nilの時に入らないとはどういう意味何ですか?(すみません
fromageblanc

2017/04/05 07:38

nilの時に入らないというのは、私の回答に対するレスですね。空欄("")しかみてないよということです。ただ今回の場合はストボーでインスタンスされる際、textプロパティは空欄でイニシャライズされるようですのでnil判定は実質必要ないのですが、暗黙保証のオプショナル(ビックリマーク付き)で定義しているので、このような場合はなるべくnil判定はおこなうようにしたほうが良いと思います。
A2wwM

2017/04/05 10:42

なるほど、確かにみてみると空欄("")の時のみですね。 ところで、priceTextField.text ?? ""はNil合体演算子ですか? そうであれば、fromageblancさんがおっしゃるnil判定も行われているということです...よね。(意味のわからないことを言ってたらすみませんっ)
fuzzball

2017/04/05 13:06

>>ストボーでインスタンスされる際 いつの間にか、コードで生成しても""がデフォルトになったようですね。
A2wwM

2017/04/05 13:46

ベストアンサーは決定しましたが、もしよろしければ最後に上記の質問にお答え頂けますと幸いです。
fromageblanc

2017/04/06 09:34

「はい」が回答になります
A2wwM

2017/04/06 10:05

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問