首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查TextField不为空后如何启用UIBarItem

检查TextField不为空后如何启用UIBarItem
EN

Stack Overflow用户
提问于 2016-10-18 19:07:06
回答 3查看 269关注 0票数 0

这是我在这个论坛上的第一个问题。我想知道如何在UITextField中包含文本的情况下启用UIBarButtonItem。我在Swift 2中见过很多这样做的例子,但在Swift 3中看不到。除了UIOutlets之外,我没有任何代码可以显示,因为我不确定如何动态检查UITextField中的文本。

EN

回答 3

Stack Overflow用户

发布于 2016-10-18 19:29:48

您需要检查textField的长度。

代码语言:javascript
复制
//MARK: - UITextFieldDelegate

func textFieldDidEndEditing(_ textField: UITextField) {

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

在控制器的顶部,您需要添加UITextFieldDelegate

代码语言:javascript
复制
class ViewController: UIViewController, UITextFieldDelegate {

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

    // Your code 
}

在故事板中,您可以按住Ctrl键并从textField拖动到控制器以添加代理。

票数 1
EN

Stack Overflow用户

发布于 2016-10-18 19:53:44

这就是为什么我不推荐使用界面生成器和故事板的原因,因为开发人员会变得“愚蠢”。

无论如何,算法是这样的:

1)文本字段具有回调方法或“委托”方法,用于文本字段事件,如用户点击return/done键。

因此,首先,您需要告诉您的文本字段委托是您的视图控制器。

2)定义必要的UITextField委托方法(https://developer.apple.com/reference/uikit/uitextfielddelegate)

3) UITextField有一个hasText方法(最新可用于iOS 10+)来判断您的文本字段是否包含任何文本。如果有,请启用该栏按钮项,否则将其禁用。

您也可以使用if let可选绑定来展开textField.text?属性,然后检查text.characters.count是否大于0,如下所示:

代码语言:javascript
复制
if let text = textField.text {
    navigationItem.rightBarButtonItem?.isEnabled = text.characters.count > 0
}

这是执行此操作的常规方法(如果您希望支持较旧的iOS版本,则在iOS 10之前) :D

完整代码如下:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-10-18 21:10:04

下面是我为解决问题而实现的代码。它不考虑iOS键盘。最后一个函数是从场景中的TextField添加到控制器(ViewController.swift)的@IBAction (编辑更改)。我右击场景中的TextField,选择动作,编辑更改并将其拖到视图控制器中。感谢所有人的iuput和代码!

代码语言:javascript
复制
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
      }
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40106574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档