ChemicalSwift
@ChemicalSwift

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

if文を使用したUIAlertControllerの実装について

Q&A

Closed

化学を専攻していることがプログラミング初心者です。
UIAlertControllerについての質問なのですが、

結論からお話しすると、3つのTextfieldに指定されている記号が入っているかを確認し、そもそもTextfieldが空であれば、空ということを知らせるアラートを実装する。また、さらにその記号に対応していない場合もアラートを表示する。という二つの点を実装したいです。

そこで、

import UIKit
class ViewController: UIViewController {

let element : [String] = ["Zr", "Cu", "Al", "Fe", "Ag", "Au", "Zn"]

override func viewDidLoad() {
    super.viewDidLoad()
}


@IBAction func gotoSecond() {
        if(MetalNameField1.text != "" && MetalNameField2.text != "" && MetalNameField3.text != "") {//空かチェック

if element.contains(MetalNameField1.text!) && element.contains(MetalNameField2.text!) && element.contains(MetalNameField3.text!) { //テキストフィールドに対応できる記号が入っているかチェック

 self.performSegue(withIdentifier: "gotoSecond", sender: nil) //画面遷移をするコード
            }else{
                //対応していない金属の場合
                noneAlert()
            }
    }else{
    //フィールドが空のときに呼び出される
    karaAlert()
    }

func karaAlert(){
        let alert: UIAlertController = UIAlertController(title: "エラー", message: "フィールドが空です。", preferredStyle:  UIAlertController.Style.alert)       
        let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler:{
            // ボタンが押された時の処理を書く(クロージャ実装)
            (action: UIAlertAction!) -> Void in
            print("OK")
        })
        alert.addAction(defaultAction)
        // Alertを表示
        present(alert, animated: true, completion: nil)
    }
func noneAlert(){
           let alert: UIAlertController = UIAlertController(title: "エラー", message: "その物質は対応していません。", preferredStyle:  UIAlertController.Style.alert)
           let defaultAction: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler:{
               // ボタンが押された時の処理を書く(クロージャ実装)
               (action: UIAlertAction!) -> Void in
               print("OK")
           })
           alert.addAction(defaultAction)
           //Alertを表示
           present(alert, animated: true, completion: nil)
       }
}

のようなコードを書いてみたのですがうまくいきません...
if文の書き方に問題があるのかと思いますが、上手な書き方がわかりません...

初歩的なことではあるかもしれませんがよろしくお願いします。

0

1Answer

のようなコードを書いてみたのですがうまくいきません...
if文の書き方に問題があるのかと思いますが、上手な書き方がわかりません...

質問するときは何がうまく行かなかったかをできるだけ詳細に書いてください。コンパイルエラーが出たならそれを貼り付けてください。操作したが思った通りに動かなかったというときは、どう操作したか、どういう結果を期待したか、期待に反してどういう結果になったかを説明し、スクリーンショットを貼るなどしてください。

さて、

override func viewDidLoad() {
    super.viewDidLoad()

の後の } が抜けていてシンタックスエラーになっていますが、これは関係ありますか?

1Like

Comments

  1. @ChemicalSwift

    Questioner

    ご返信ありがとうございます。

    私の期待していた結果としては、
    テキストフィールドが空の場合→空アラートを表示
    テキストフィールドに対応していない記号が入った場合→ノーサポートアラートを表示

    実際の結果は、エラーも起きず、アラートも表示されませんでした。

    ご指摘していただいた箇所ですが、swift上では記載しておりましたので、その点に関しては関係がないと考えられます。(抜けてしまって申し訳ないです。)

  2. 手元でコードを実行できないので推測ですが、可能性は

    - if の条件式に問題があって、いつでも「画面遷移をするコード」の分岐に入る
    - 空アラートやノーサポートアラートの分岐に入っているが、アラートの表示に失敗している
    - ボタンか何かと gotoSecond() の接続に問題があって、 gotoSecond() が呼ばれていない
    - gotoSecond() の中でクラッシュしている

    などが考えられます。 MetalNameField1〜3 のどれかが nil で、 .text を読み取ろうとしてクラッシュしているのがありそうな感じです。

    「エラーも起きず、アラートも表示されませんでした」のとき、画面遷移は実行されているんですか?
  3. 問題がありそうな場所の可能性が多くて手が付けられないときは、コードを単純化してみて可能性を潰してください。 gotoSecond() を

    @IBAction func gotoSecond() { karaAlert() }

    と書き換えてみれば、 gotoSecond() が正しく呼ばれるかどうか、 karaAlert() でアラートが正しく表示されるかどうかは確認できます。その状態で、次はアラートに表示するメッセージを

    message: MetalNameField1.text!

    としてみれば、テキストフィールド1に入力した記号を取得できているかどうかが分かります。テキストフィールド2と3も順に試してみてください。

Your answer might help someone💌