2017-11-26 17 views
0

私はUIAlertViewsのハンドラを宣言する際のいくつかの例を読んだことがありますが、何らかの形で正しい構文の概念を理解できません。
- ハンドラー:someFunction
ハンドラー:{Some inFunctionのアクション}( "アクションの意味"とは何ですか) ハンドラー:{_ in print "Foo!")(やはり "in"の意味は?)ハンドラの宣言が機能しない

私の最大の懸念は、これらのことが何を意味するのか分からないことです。そして私は、私は次のエラーを取得するしかし最初のスタイルを使用しようとしている:「変数は、独自の初期値内で使用される」

let answerVCAlert = UIAlertController(title: "Your turn", message: "What's the answer?", preferredStyle: .alert) 
    let submitAnswer = UIAlertAction(title: "Submit", style: .default, handler: submitAnswer(answer: " ")) //grab from textfield 

    let noAnswer = UIAlertAction(title: "No Answer", style: .default, handler: submitAnswer(answer: " ")) 

    func submitAnswer(answer: String) { 
     print ("The string passed is \(answer)") 
     //compare answer to correct answer 
    } 

    func attemptAnswer() { 
     answerVCAlert.addAction(submitAnswer) 
     answerVCAlert.addAction(noAnswer) 
     //answerVCAlert.addTextField //how ??? too many different examples 

     self.present(answerVCAlert, animated: true, completion: nil) 
    } 
+0

ここでattempAnswerメソッドを呼び出していますか? –

+2

* "私はこれらのことが何を意味するのか分かりません" * - あなたは[Closures](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures)を読んでみたいと思うでしょう。 html)の章を参照してください。 –

+0

私はクロージャを読みました。私はクロージャが何であるかという概念を知っていて、Javaのラムダ式にも精通しています。通常、私を捨てるのは文法の一部です(特に、 "action"や "in"のような単語を使用する場合、アクションの定義やアクションの定義はどういう意味ですか?)。申し訳ありませんが私の営業で不明だった場合は、コンセプトが何であるか知っていますが、誰もがこの構文を持っている例を提供して以来、私は文法が私を取得するです –

答えて

1

コメントで述べたように、今、クロージャを使うか、completion handlersする方法を学ぶ時間です。それはよく使われた時間です。

ここには、テキストフィールドも含まれています(ごく一部のマイナーチェンジに基づいています)。警告テキストフィールドからテキストを取得するための優れたSwift 3の例はthis SO answerです。下のコードでSwift 4の構文に変更があります。

補完ハンドラの理解を助けることを期待してコードをインデントしました。いくつかのインラインコメントも追加しました。ここで

は警告です:

// I changed the name of your alert controller for brevity 

let alertVC = UIAlertController(
    title: "Your turn", 
    message: "What's the answer?", 
    preferredStyle: .alert) 

// Add a textfield called answerText. You may not want the placeholder to be blank. 

alertVC.addTextField(configurationHandler: {(answerText: UITextField!) in 
    answerText.placeholder = "Default answer" 
}) 

// Add a Submit button that will call submitAnswer() 

let submitAnswer = UIAlertAction(
    title: "Submit", 
    style: .default, 
    handler: { action -> Void in 
     self.submitAnswer(alertVC.textFields![0]) 
    }) 
alertVC.addAction(submitAnswer) 

// Add a No Answer button that will call noAnswer() 
// NOTE: I changed this to be style of cancel... check out how it's rendered. 

let noAnswer = UIAlertAction(
    title: "No Answer", 
    style: .cancel, 
    handler: { action -> Void in 
     self.noAnswer() 
    }) 
alertVC.addAction(noAnswer) 

// I think you *want* everybody to try to answer, so let's make that the preferred action. 

alertVC.preferredAction = submitAnswer 
present(
    alertVC, 
    animated: true, 
    completion: nil) 

そして、ここではその結果です:.defaultから.cancelにワンアクションのスタイルを変更し

  • :私が行った変更の中で

    func submitAnswer(_ answer: String) { 
        print ("The answer is \(answer)") 
        //compare answer to correct answer 
    } 
    func noAnswer() { 
        print ("Cancel was tapped.") 
    } 
    

    ですそれがあなたの考えを伝えます。

  • selfを補完ハンドラの呼び出しに追加しました。これは必須です。
  • submitAnswer()のシグネチャをパラメータラベルが不要に変更しました。そんなに速くです。
  • noAnswerアクションコールをsubmitAnswer()からnoAnswer()に変更して、ユーザーがタップした内容を区別します。
+0

こんにちは、ありがとうコードです。それは本当にそのようにそれを分解するのに役立ちます。私はちょうど質問があります、なぜ、何が "アクション - >無効になるのか"です。これらの4つのことのそれぞれが意味することをどこで正確に読むことができますか?私は仮定します - >ボイドは何も返しません。しかし、 "アクション"と "イン"は本当に私を困惑させています。これらはどこに定義されていますか?彼らは正確な言葉ですか、それとも変数ですか?私はこれらの言葉を何か他のものと置き換えることはできますか –

+0

これは、クロージャーまたは完了ハンドラーの理解の一部です。 @Martin_Rのリンクは、私が助けてくれたものと一緒にあなたに与えました。私のリンクでは、完了ハンドラセクションまでスクロールします。私はちょうど私がこれについて専門家ではないので、 'action - > Void in'の自分の説明を削除しました。たいていの場合、私のコードはハンドラを必要としません(私は単に 'nil'を使います)、私があなたに与えたリンクで作業します。それは非常に強力な(そして奇妙な)構文です - あなたは本当にアラートコントローラにパラメータとして関数を渡しています - そして、私はまだそれを理解しています! – dfd

関連する問題