这是我在这个论坛上的第一个问题。我想知道如何在UITextField中包含文本时启用UIBarButtonItem。我已经看到很多关于如何在Swift 2中执行此操作的示例,而不是Swift 3.这是一个简单的应用程序,用于将一些数据保存到核心数据。我没有任何代码可以显示UIOutlets等,因为我不确定如何动态检查UITextField文本。
答案 0 :(得分: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
}
在故事板中,您可以从textField按住Ctrl键拖动到控制器以添加委托。
答案 1 :(得分:0)
这就是为什么我不建议使用Interface Builder和Storyboard,开发人员“愚蠢”。
无论如何,算法是这样的:
1)文本字段具有回调方法或“委托”方法,用于文本字段事件,例如用户点击返回/完成键。
首先,您需要告诉您的文本字段委托是您的视图控制器。
2)您定义了必要的UITextField委托方法(https://developer.apple.com/reference/uikit/uitextfielddelegate)
3)UITextField有一个hasText
方法(iOS 10+新推出)可以判断你的文本字段是否有任何文本。如果有,请启用栏按钮项,否则禁用它。
您也可以使用if let
可选绑定来打开textField.text?
属性,然后检查text.characters.count
大于0,如下所示:
if let text = textField.text {
navigationItem.rightBarButtonItem?.isEnabled = text.characters.count > 0
}
这是传统的做法(如果你想支持旧的iOS版本,在iOS 10之前):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()
}
}
答案 2 :(得分:0)
以下是我为解决问题而实施的代码。它没有考虑iOS键盘。最后一个函数是从场景中的TextField添加到控制器(ViewController.swift)的@IBAction(编辑已更改)。我右键单击场景中的TextField选择Action,Editing Changed并将其拖动到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
}
}
}