如果 Swift 中的 TextField 中没有输入文本,则使 UIButton 处于非活动状态
Make a UIButton inactive if no text is entered in a TextField in Swift
所以我的概念很简单,我有一个文本字段和一个标记为 'Next' 的按钮。如果用户没有在文本字段中放置任何内容,我希望对用户禁用“下一步”按钮。为此,我有 运行 这个代码:
@IBAction func nextButton(sender: UIButton) {
if textField.text.isEmpty {
buttonLabel.userInteractionEnabled = false
}
}
这将按我的意愿禁用按钮,但问题是,如果随后在文本字段中输入文本,该按钮仍处于禁用状态。我曾尝试在 "if" 语句之后添加 "else" 语句来反转我所说的,看看它是否有效,但它没有。
非常感谢任何帮助。
尼克
我的代码:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
func imageEffect() {
// Set vertical effect for background
var verticalMotionEffect : UIInterpolatingMotionEffect =
UIInterpolatingMotionEffect(keyPath: "center.y",
type: .TiltAlongVerticalAxis)
verticalMotionEffect.minimumRelativeValue = -20
verticalMotionEffect.maximumRelativeValue = 20
// Set horizontal effect for background
var horizontalMotionEffect : UIInterpolatingMotionEffect =
UIInterpolatingMotionEffect(keyPath: "center.x",
type: .TiltAlongHorizontalAxis)
horizontalMotionEffect.minimumRelativeValue = -20
horizontalMotionEffect.maximumRelativeValue = 20
// Create group for background to combine both
var group : UIMotionEffectGroup = UIMotionEffectGroup()
group.motionEffects = [horizontalMotionEffect, verticalMotionEffect]
// Add both effects to your view for background
myBackgroundView.addMotionEffect(group)
}
var datePickerView:UIDatePicker = UIDatePicker()
@IBAction func textFieldEdited(sender: UITextField) {
var datePickerView : UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
}
func handleDatePicker(sender: UIDatePicker) {
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd MMMM yyyy"
questionTextField.text = dateFormatter.stringFromDate(sender.date)
}
var countryData = ["United Kingdom", "France", "Spain", "Germany", "Berlin", "Eygpt", "United States"]
var pickerView:UIPickerView = UIPickerView()
@IBOutlet var progressStatus: UIProgressView!
@IBOutlet var barImage: UIImageView!
@IBOutlet var questionLabel: UILabel!
@IBOutlet var buttonBarImage: UIImageView!
@IBOutlet var buttonLabel: UIButton!
@IBOutlet var myBackgroundView: UIImageView!
@IBOutlet var questionTextField: UITextField!
let questions = ["Where are you going?", "What are you doing there?", "When do you go?"]
var currentQuestionIndex = 0
let placeholder = ["Country", "Activity", "Date"]
var currentPlaceholderIndex = 0
@IBAction func nextButton(sender: AnyObject) {
if currentQuestionIndex == 0 {
progressStatus.setProgress(0.333, animated: true)
} else if currentQuestionIndex == 1 {
progressStatus.setProgress(0.666, animated: true)
} else {
progressStatus.setProgress(1, animated: true)
}
// Initial setup on button press
questionTextField.hidden = false
barImage.hidden = false
questionTextField.placeholder = placeholder[currentPlaceholderIndex]
questionLabel.text = questions[currentQuestionIndex]
questionTextField.resignFirstResponder()
// Reset text field to have no text
questionTextField.text = ""
// Displays the questions in array and displays the placeholder text in the textfield
if currentQuestionIndex <= questions.count && currentPlaceholderIndex <= placeholder.count {
currentQuestionIndex++
currentPlaceholderIndex++
//progressStatus.setProgress(0.333, animated: true)
buttonLabel.setTitle("Next", forState: UIControlState.Normal)
// Animate text for questionLabel
UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.5, options: nil, animations: {
self.questionLabel.center = CGPoint(x: -110 , y: 305 + 20)
}, completion: nil)
} else {
//Add some logic here to run whenever the user has answered all the questions.
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
questionTextField.delegate = self
pickerView.delegate = self
pickerView.dataSource = self
// Applies the image effect to the image in myBackgroundImage
imageEffect()
// Sets the button text
buttonLabel.setTitle("Get started", forState: UIControlState.Normal)
// Sets the question text to be blank
questionLabel.text = ""
// Sets placeholder text in the text field
questionTextField.placeholder = ""
// Hides the text field
questionTextField.hidden = true
// Hides the image background for the text field
barImage.hidden = true
// Sets the progress bar to nil
progressStatus.setProgress(0, animated: true)
if questionTextField.text.isEmpty {
buttonLabel.userInteractionEnabled = false
}
}
func textFieldDidBeginEditing(textField: UITextField) {
buttonLabel.userInteractionEnabled = true
switch currentQuestionIndex {
case 0:
// TODO: Add UIPickerView
self.view.addSubview(datePickerView)
case 2:
// TODO: Add UIDatePicker
self.view.addSubview(datePickerView)
default:
println("default")
}
}
// resigns the keyboard when user presses the return/next key on keyboard
func textFieldShouldReturn(textField: UITextField) -> Bool {
questionTextField.resignFirstResponder()
return true
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return countryData.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return countryData[row]
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
questionTextField.text = countryData[row]
pickerView.hidden = true
}
// Resigns the keyboard if the user presses anywhere on the screen
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
self.view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
您必须将 VC 设置为 TextFieldDelegate。所以你可以对文本字段状态做出反应。看这个小例子 class:
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var myTextField: UITextField!
@IBOutlet weak var myButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Set the delegate of your textField to this class
myTextField.delegate = self
if myTextField.text.isEmpty {
myButton.userInteractionEnabled = false
}
}
// This method is available, because this class is now the delegate
func textFieldDidBeginEditing(textField: UITextField) {
myButton.userInteractionEnabled = true
}
}
这应该与您的 VC 非常相似。
请注意第一行,其中 VC 被告知要遵守 TextFieldDelegate 协议。
编辑:
在viewDidLoad
或viewWillAppear
中设置myButton.userInteractionEnabled = false
。
设置你的 textField
的 delegate
。
然后
func textFieldDidBeginEditing(textField: UITextField) {
if !textField.text.isEmpty
myButton.enable = true
} else {
buttonLabel.enable = false
}
}
您的代码应类似于以下内容,假设仅当我们在一个文本字段中有文本时才应启用“下一步”按钮,否则您需要相应地更改逻辑。
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
@IBOutlet weak var textField3: UITextField!
@IBOutlet weak var nextButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
nextButton.userInteractionEnabled = false
textField1.delegate = self
textField2.delegate = self
textField3.delegate = self
}
@IBAction func NextButtonAction(sender: UIButton)
{
println("Next Button Tapped")
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if textField == textField1
{
var oldStr = textField1.text as NSString
var newStr = oldStr.stringByReplacingCharactersInRange(range, withString: string) as NSString
if newStr.length == 0
{
nextButton.userInteractionEnabled = false
}else
{
nextButton.userInteractionEnabled = true
}
}
return true
}
}
事件应响应编辑更改,
Swift版本
@IBAction func editingChanged(textfield: UITextField) {
myButton.enabled = textfield.text?.characters.count > 0
}
所以我的概念很简单,我有一个文本字段和一个标记为 'Next' 的按钮。如果用户没有在文本字段中放置任何内容,我希望对用户禁用“下一步”按钮。为此,我有 运行 这个代码:
@IBAction func nextButton(sender: UIButton) {
if textField.text.isEmpty {
buttonLabel.userInteractionEnabled = false
}
}
这将按我的意愿禁用按钮,但问题是,如果随后在文本字段中输入文本,该按钮仍处于禁用状态。我曾尝试在 "if" 语句之后添加 "else" 语句来反转我所说的,看看它是否有效,但它没有。
非常感谢任何帮助。
尼克
我的代码:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {
func imageEffect() {
// Set vertical effect for background
var verticalMotionEffect : UIInterpolatingMotionEffect =
UIInterpolatingMotionEffect(keyPath: "center.y",
type: .TiltAlongVerticalAxis)
verticalMotionEffect.minimumRelativeValue = -20
verticalMotionEffect.maximumRelativeValue = 20
// Set horizontal effect for background
var horizontalMotionEffect : UIInterpolatingMotionEffect =
UIInterpolatingMotionEffect(keyPath: "center.x",
type: .TiltAlongHorizontalAxis)
horizontalMotionEffect.minimumRelativeValue = -20
horizontalMotionEffect.maximumRelativeValue = 20
// Create group for background to combine both
var group : UIMotionEffectGroup = UIMotionEffectGroup()
group.motionEffects = [horizontalMotionEffect, verticalMotionEffect]
// Add both effects to your view for background
myBackgroundView.addMotionEffect(group)
}
var datePickerView:UIDatePicker = UIDatePicker()
@IBAction func textFieldEdited(sender: UITextField) {
var datePickerView : UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
}
func handleDatePicker(sender: UIDatePicker) {
var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd MMMM yyyy"
questionTextField.text = dateFormatter.stringFromDate(sender.date)
}
var countryData = ["United Kingdom", "France", "Spain", "Germany", "Berlin", "Eygpt", "United States"]
var pickerView:UIPickerView = UIPickerView()
@IBOutlet var progressStatus: UIProgressView!
@IBOutlet var barImage: UIImageView!
@IBOutlet var questionLabel: UILabel!
@IBOutlet var buttonBarImage: UIImageView!
@IBOutlet var buttonLabel: UIButton!
@IBOutlet var myBackgroundView: UIImageView!
@IBOutlet var questionTextField: UITextField!
let questions = ["Where are you going?", "What are you doing there?", "When do you go?"]
var currentQuestionIndex = 0
let placeholder = ["Country", "Activity", "Date"]
var currentPlaceholderIndex = 0
@IBAction func nextButton(sender: AnyObject) {
if currentQuestionIndex == 0 {
progressStatus.setProgress(0.333, animated: true)
} else if currentQuestionIndex == 1 {
progressStatus.setProgress(0.666, animated: true)
} else {
progressStatus.setProgress(1, animated: true)
}
// Initial setup on button press
questionTextField.hidden = false
barImage.hidden = false
questionTextField.placeholder = placeholder[currentPlaceholderIndex]
questionLabel.text = questions[currentQuestionIndex]
questionTextField.resignFirstResponder()
// Reset text field to have no text
questionTextField.text = ""
// Displays the questions in array and displays the placeholder text in the textfield
if currentQuestionIndex <= questions.count && currentPlaceholderIndex <= placeholder.count {
currentQuestionIndex++
currentPlaceholderIndex++
//progressStatus.setProgress(0.333, animated: true)
buttonLabel.setTitle("Next", forState: UIControlState.Normal)
// Animate text for questionLabel
UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.5, options: nil, animations: {
self.questionLabel.center = CGPoint(x: -110 , y: 305 + 20)
}, completion: nil)
} else {
//Add some logic here to run whenever the user has answered all the questions.
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
questionTextField.delegate = self
pickerView.delegate = self
pickerView.dataSource = self
// Applies the image effect to the image in myBackgroundImage
imageEffect()
// Sets the button text
buttonLabel.setTitle("Get started", forState: UIControlState.Normal)
// Sets the question text to be blank
questionLabel.text = ""
// Sets placeholder text in the text field
questionTextField.placeholder = ""
// Hides the text field
questionTextField.hidden = true
// Hides the image background for the text field
barImage.hidden = true
// Sets the progress bar to nil
progressStatus.setProgress(0, animated: true)
if questionTextField.text.isEmpty {
buttonLabel.userInteractionEnabled = false
}
}
func textFieldDidBeginEditing(textField: UITextField) {
buttonLabel.userInteractionEnabled = true
switch currentQuestionIndex {
case 0:
// TODO: Add UIPickerView
self.view.addSubview(datePickerView)
case 2:
// TODO: Add UIDatePicker
self.view.addSubview(datePickerView)
default:
println("default")
}
}
// resigns the keyboard when user presses the return/next key on keyboard
func textFieldShouldReturn(textField: UITextField) -> Bool {
questionTextField.resignFirstResponder()
return true
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return countryData.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return countryData[row]
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
questionTextField.text = countryData[row]
pickerView.hidden = true
}
// Resigns the keyboard if the user presses anywhere on the screen
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
self.view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
您必须将 VC 设置为 TextFieldDelegate。所以你可以对文本字段状态做出反应。看这个小例子 class:
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var myTextField: UITextField!
@IBOutlet weak var myButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Set the delegate of your textField to this class
myTextField.delegate = self
if myTextField.text.isEmpty {
myButton.userInteractionEnabled = false
}
}
// This method is available, because this class is now the delegate
func textFieldDidBeginEditing(textField: UITextField) {
myButton.userInteractionEnabled = true
}
}
这应该与您的 VC 非常相似。
请注意第一行,其中 VC 被告知要遵守 TextFieldDelegate 协议。
编辑:
在viewDidLoad
或viewWillAppear
中设置myButton.userInteractionEnabled = false
。
设置你的 textField
的 delegate
。
然后
func textFieldDidBeginEditing(textField: UITextField) {
if !textField.text.isEmpty
myButton.enable = true
} else {
buttonLabel.enable = false
}
}
您的代码应类似于以下内容,假设仅当我们在一个文本字段中有文本时才应启用“下一步”按钮,否则您需要相应地更改逻辑。
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
@IBOutlet weak var textField3: UITextField!
@IBOutlet weak var nextButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
nextButton.userInteractionEnabled = false
textField1.delegate = self
textField2.delegate = self
textField3.delegate = self
}
@IBAction func NextButtonAction(sender: UIButton)
{
println("Next Button Tapped")
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if textField == textField1
{
var oldStr = textField1.text as NSString
var newStr = oldStr.stringByReplacingCharactersInRange(range, withString: string) as NSString
if newStr.length == 0
{
nextButton.userInteractionEnabled = false
}else
{
nextButton.userInteractionEnabled = true
}
}
return true
}
}
事件应响应编辑更改, Swift版本
@IBAction func editingChanged(textfield: UITextField) {
myButton.enabled = textfield.text?.characters.count > 0
}