2016-10-18 6 views
0

これはこのフォーラムの最初の質問です。 UITextFieldにテキストがある場合にのみUIBarButtonItemを有効にする方法を知りたいと思います。私はSwift 2ではこれを行う方法の多くの例を見てきましたが、Swift 3ではそうではありませんでした。これは、いくつかのデータをコアデータに保存するための簡単なアプリケーションです。私はUITextFieldをチェックして、その場でテキストを確認する方法がわからないので、UIOutlets以外のコードを表示するコードはありません。TextFieldが空でないことを確認した後、UIBarItemを有効にする方法

答えて

1

textFieldの長さを確認する必要があります。あなたの一番上に

//MARK: - UITextFieldDelegate 

func textFieldDidEndEditing(_ textField: UITextField) { 

    if let text = exampleTextFiled.text { 
     exampleBarButtonItem.isEnabled = text.characters.count > 0 
    } 
} 

あなたは UITextFieldDelegate

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet var exampleTextField: UITextField! 
    @IBOutlet var exampleBarButtonItem: UIBarButtonItem! 

    // Your code 
} 

を追加し、ストーリーボードにあなたはCtrlキーを押しながらドラッグすることができますテキストフィールドからの代理人を追加するコントローラする必要がありますコントローラ。

+0

@ P.Pawlusしたがって、3つの回答を見て、解決策を見つけました。私はあなたのコードに従っていましたが、動作させることができませんでしたが、私はあなたのソリューションを完全に理解していないかもしれません。私がやったことは、シーンのテキストフィールドから@IBActionアクションをコントローラーに追加して編集を変更し、上記を使ってBarButtonを有効または無効にしました。 –

+0

@TerryLadden @IBActionをtextFieldに追加しないでください。ちょうど@IBOutletを追加してデリゲートする必要があります。テキストフィールドから 'View Contrller'(ストーリーボードのコントローラーの上の黄色い円)にCtrl +ドラッグすることでこれを行うことができます。 @IBOutletのあなたの名前を選んで代理する必要があります。これを行う方法がわからない場合は、https://developer.appleを参考にしてください。com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson3.html - パート:UI要素のアウトレットを作成する –

+0

私はドキュメントを読んで、これがどのように優れているかを理解しています。ありがとうございました。私はこの学習プロセスが大好きです。しかし、あなたのソリューションは一度動作しますが、テキストフィールドにテキストを入力し終えたら、テキストフィールドにテキストがあることを確認します。テキストフィールドにテキストがあるときだけ、保存ボタンを有効にします私が入力するように。私が私の答えで投稿したのと同じように、私はIBOutletを使ってそれを行うことができますが、テキストフィールドをデリゲートとして使用する方法を理解できないようです。助言がありますか? –

0

私はInterface BuilderとStoryboardsを使用しないことをお勧めします。開発者は「ダンプダウン」します。

1)テキストフィールドは、コールバックメソッドまたはリターン/行わキーをタップし、ユーザーのようなテキストフィールドイベントの「デリゲート」のメソッドを持っています:

とにかく、このアルゴリズムは、このようなものです。

まず、テキストフィールドにデリゲートがビューコントローラであることを伝える必要があります。

2)あなたは、あなたのテキストフィールドには任意のテキストを持っている場合UITextFieldには伝えることのために必要なのUITextFieldのデリゲートメソッド(https://developer.apple.com/reference/uikit/uitextfielddelegate

3)10+のiOS用に新しく利用可能hasText方法は(ある)を定義します。存在する場合は、バーボタン項目を有効にし、そうでない場合は無効にします。あなたが代わりにあなたのtextField.text?プロパティをアンラップへの結合オプションif letを使用することができます

、その後、text.characters.countをチェックすると、そのような0より大きい:

if let text = textField.text { 
    navigationItem.rightBarButtonItem?.isEnabled = text.characters.count > 0 
} 

したい場合、これは(iOSの10の前にそれを行うための従来の方法であります)古いIOSのバージョンをサポートする:D

満杯のコードは以下である:

class ViewController: UIViewController, UITextFieldDelegate { 
    @IBOutlet var myTextField:UITextField! 

    ... 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // self is referring to this view controller 
     ... 
     myTextField.returnKeyType = UIReturnKeyType.done 
     myTextField.delegate = self 
    } 

    // UITextField Delegate Methods 
    func textFieldDidEndEditing(_ textField: UITextField) { 

     // get the navigation bar button (right bar button in my case) 
     // and set its "isEnabled" property depending on whether 
     // the textField has any text using "hasText" of UITextField 
     navigationItem.rightBarButtonItem?.isEnabled = textField.hasText 
    } 

    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 

     hideKeybaord() 

     return false 
    } 

    // UITouches delegate methods for extra user experience polish 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

     // hides keyboard when user taps on the background 
     hideKeybaord() 
    } 

    // resusable hideKeyboard method 
    func hideKeybaord() { 
     myTextField.resignFirstResponder() 

     // in case you need to hide all other text fields in the future 
     // textField2.resignFirstResponder() 
     // textField3.resignFirstResponder() 
    } 
} 
+0

答えとコードをお寄せいただきありがとうございます。現時点ではハードウェアキーボードを使用してテキストを入力していますので、iOSキーボードで作業するコードを見ていきます –

+0

ハードウェアキーボードですか?たとえば、Logitechのサードパーティのキーボードを使用するアプリを構築していますか? – Zhang

+0

いいえ、サードパーティのキーボードを利用するためのアプリを構築していません。私はSwiftを学んでおり、私はコアデータなどを学ぶための単純なアプリを作っています。私はテキストを入力するためにシミュレータのハードウェアキーボードを使用しています。次に、画面上のキーボードの使用を検討します。 –

0

B私の問題を解決するために実装したコードはelowです。 iOSキーボードは考慮されていません。最後の機能は、SceneのTextFieldからコントローラ(ViewController.swift)に追加された@IBAction(Editing Changed)です。シーンのTextFieldを右クリックして、アクションを選択し、編集を変更し、View Controllerにドラッグしました。あなたのiuputとコードのおかげで!

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 

    // Add Outlet 
    @IBOutlet weak var tvShowName: UITextField! 
    @IBOutlet weak var saveButton: UIBarButtonItem! 


    // Add functions 

    @IBAction private func saveButton(_ sender: UIBarButtonItem) { 

     let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
     let newTVShow = TVShows(context: context) 

     newTVShow.name = tvShowName.text 

     do { 
     try context.save() 
     navigationController!.popViewController(animated: true) 
     } catch { 
     let alert = UIAlertController(title: "Oops!", message: "Failed to save the TV Show", preferredStyle: UIAlertControllerStyle.alert) 
     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)) 
     self.present(alert, animated: true, completion: nil) 
     } 
    } 

    @IBAction private func cancelButton(_ sender: UIBarButtonItem) { 
     // Code for cancel 
     navigationController!.popViewController(animated: true) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     saveButton.isEnabled = false 
    } 

    @IBAction func tvShowTextFieldEditChanged(_ sender: UITextField) { 
     if let text = tvShowName.text{ 
      saveButton.isEnabled = text.characters.count > 0 
     } 
    } 
} 
関連する問題