2017-05-26 3 views
2

だから私はUIAlertControllerは、2つのテキストフィールドで、私はそれらのテキストフィールドは、それらが一定の基準を満たすかどうかを確認するために編集されるたびに監視したいしています。この場合:UITextFieldですか?

、私は私の警告ボタンがある限り、両方のテキストフィールドの入力が、私は関数に渡したい数よりも短くなっていると、非アクティブになりたいです。

textField.addTarget(自己、アクション:#selector(self.handleTextFieldEdit)、用:.editingChanged)handleTextFieldEdit内部

私はこれを持っている:

は、だから私は両方のテキストフィールドに、この目標を追加

func handleTextFieldEdit(_ textField: UITextField, number: Int) 
{ 
    let number = number 
    let alertController:UIAlertController = self.presentedViewController as! UIAlertController; 
    let textField: UITextField = alertController.textFields![0] 
    let confirmField: UITextField = alertController.textFields![1] 
    let addAction: UIAlertAction = alertController.actions[0]; 

    if ((textField.text?.characters.count)! > number && (confirmField.text?.characters.count)! > number) 
    { 
     addAction.isEnabled = true 
    } 
    else if ((textField.text?.characters.count)! <= number || (confirmField.text?.characters.count)! <= number) 
    { 
     addAction.isEnabled = false 
    } 
} 

今私の最初の問題は、私は#selector funcを持つ任意の変数を渡すように見えることはできませんです。

私の第二の問題は、私は、TextField _に合格するのか分からないです。UITextFieldです

私は(私は私のUITextFieldsに宣言したものです)のUITextFieldとTextFieldの両方を試してみました。

まで来るエラーがある:「期待される引数の型にUITextField'.Type 『タイプの値を変換できませんUITextFieldです』。

編集:私はところで機能と変数を渡さない時はいつでも私のコードのすべてが動作します。問題は、関数を呼び出すたびに最小値を変更したいということです。

答えて

0

ここにいくつかのテストコードがあります。基本的には、UIAlertViewControllerをサブクラス化し、UITextFieldsUIAlertActionを追加する関数を追加しました。

テキストフィールドは、最小長とプレースホルダ値を含むタプル(Int、String)を渡すことによって作成されます。作成時に[OK]ボタンは無効になります。

内部的にはhandleTextFieldEdit()機能を追加しましたが、リファクタリングしました。 2番目の配列にBoolを設定します。単純に1つの配列を使用することもできますが、これは単なる例です。次に、新しい関数を呼び出してokButton.isEnabledプロパティを設定します。私UIViewController

public func showAlert(_ title:String, _ message:String) { 

    // use the subclassed UIAlertViewController 
    // - add two text fields with minimum length and placeholders 
    // - add an OK button 

    let alertVC = MyAlertController(
     title: "MyTitle", 
     message: "MyMessage", 
     preferredStyle: .alert) 
    alertVC.addTextFields([(5,"Enter First Name"),(10,"Enter Last Name")]) 
    alertVC.addOkAction() 

    present(
     alertVC, 
     animated: true, 
     completion: nil) 
} 

そして、私のサブクラス化UIAlertViewController:

class MyAlertController: UIAlertController { 

    var textMinLengths = [Int]() 
    var textMinLengthsReached = [Bool]() 
    var okAction:UIAlertAction! 

    // add UITextFields: 
    // - append textMinLengths[] 
    // - set placeholder 
    // - append "false" to textMinLengthsReached[] 
    // - set tag value to array index 
    // - add target action handleTextFieldEdit() 

    func addTextFields(_ textConfigs:[(Int,String)]) { 
     var tagValue:Int = 0 
     for textConfig in textConfigs { 
      textMinLengths.append(textConfig.0) 
      textMinLengthsReached.append(false) 
      self.addTextField { (textField : UITextField!) -> Void in 
       textField.placeholder = textConfig.1 
       textField.tag = tagValue 
       textField.addTarget(self, action: #selector(self.handleTextFieldEdit(_:)), for: .editingChanged)   } 
      tagValue += 1 
     } 
    } 

    // add a *disabled* OK button 

    func addOkAction() { 
     okAction = UIAlertAction(
      title: "OK", 
      style: .cancel, 
      handler: { action -> Void in 
     }) 
     self.addAction(okAction) 
     okAction.isEnabled = false 
    } 

    // every keystroke, check the character count against the minimum, setting if it's been reached, 
    // always checking whether to show alert action afterwards 

    func handleTextFieldEdit(_ sender: UITextField) { 
     if (sender.text?.characters.count)! >= textMinLengths[sender.tag] { 
      textMinLengthsReached[sender.tag] = true 
     } else { 
      textMinLengthsReached[sender.tag] = false 
     } 
     showAlertAction() 
    } 

    // loop through textMinLengthsReached, setting okButton.isEnabled 

    func showAlertAction() { 
     var isEnabled = true 
     for textMinLengthReached in textMinLengthsReached { 
      if !textMinLengthReached { 
       isEnabled = false 
       break 
      } 
     } 
     okAction.isEnabled = isEnabled 
    } 
} 
+0

お返事ありがとうございました! – Elhoej

0

はあなたがIBActionセレクタにEXTRAパラメータ(int)を追加しようとしているコード

textField.addTarget(self, action: #selector(self.handleTextFieldEdit(sender:)), for: .editingChanged) 

func handleTextFieldEdit(sender: UITextField) { 
} 
+0

私は、これは私の問題を解決する方法がわからないんだけど?もう少し説明できますか? – Elhoej

1

の下に試してみてください。あなたはそれをすることはできません。 IBActionsには3つのセレクタがあります:

@IBAction func actionNoParams() { 
} 

@IBAction func actionWSender(_ sender: Any) { 
} 

@IBAction func actionWSenderAndEvent(_ sender: Any, forEvent event: UIEvent) { 
} 

これらはあなたの唯一のオプションです。パラメーターを追加したり、可能なパラメーターのいずれかのタイプを変更することはできません。

システムは、コントロールがターゲット/アクションを呼び出す必要があるときに、関数を呼び出します。

(ターゲット/アクションをコントロールに追加する場合は、@IBActionキーワードを使用して関数にラベルを付けない場合でも、上記の関数シグネチャのいずれかを使用する必要があります。一部のオブジェクトは、あなたがそれにデリゲートを割り当てる必要があるの内側にテキストフィールドでAlertControllerを作成する例については、このテキストフィールド

の代理人でなければならないテキストフィールドの変化を追跡するために

+0

@IBActionを自分のコードに追加する必要があるのはなぜですか?ストーリーボードにしか使われていないのですか? – Elhoej

+1

それは良い習慣です。この関数は、ターゲット/アクション内のコントロールによって呼び出されていることを示しています。 –

0

。メソッドの内部のどこかに

YourViewControllerの一部:

self.alertView = UIAlertController.init(title: "Your title", message: Your message", preferredStyle: .alert) 
self.alertView.addTextField(configurationHandler: { textfield in 
textfield.font = UIFont.fontProximaNovaLight(18) 
textfield.textColor = UIColor.colorAppLightGray2() 
textfield.keyboardType = .default 
textfield.delegate = self 
}) 

あなたのViewControllerの拡張:

extension YourViewController: UITextFieldDelegate { 

    func textField(_ textField: UITextField, 
        shouldChangeCharactersIn range: NSRange, 
        replacementString string: String) -> Bool { 

     let text = textField.text?.replacingCharacters(in: range.toRange(textField.text!), with: string) 
     // some test verification 
     // for example you can use your function to verify textfield against value 
     // validate (textfield, number) 



     if text?.characters.count > 0 { 
      self.alertView.actions[0].isEnabled = true 
     } else { 
      self.alertView.actions[0].isEnabled = false 
     } 

     return true 
    } 
} 
0

サブクラスのUITextFieldをし、あなたの長さの要件に使用する別のプロパティを追加します。その後、それを送信者の一部として読むことができます。

関連する問題