我在视图中有几个uitextfields,我想禁用uibutton,直到所有字段都输入了一些内容。这样做的最佳方法是什么? 理想情况下,我也想做一些基本的验证(确保所有条目都是数字)。
修改
无法让下面的解决方案完全奏效。下面是我工作的版本(由Brad,Mike和其他各种来源拼凑而成)
使用UITextFieldDelegate
在IB中创建文本字段,并附加到相关的IBOutlets - textField1,textField2等
在IB中创建并将按钮连接到其相关的IBOutlet(submitButton)和IBAction(submitAction)。在IB中取消选中已启用。
在视图控制器中创建一个validate方法:
-(IBAction)validateTextFields:(id)sender
{
// make sure all fields are have something in them
if ((textField1.text.length > 0) && (textField2.text.length > 0) && (textField3.text.length > 0)) {
self.submitButton.enabled = YES;
}
else {
self.submitButton.enabled = NO;
}
}
将每个字段'Editing Changed'事件连接到validateTextFields方法。 (注意:'Value Changed'事件似乎不起作用)
使用此委托方法限制字符(在我的情况下为数字,最多为一个句号)。这一位来自Erica Sadun btw。
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *cs;
NSString *filtered;
// Check for period
if ([textField.text rangeOfString:@"."].location == NSNotFound)
{
cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
// Period is in use
cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
瞧。
答案 0 :(得分:5)
您需要在管理视图的视图cOntroller中的所有文本字段上实现UITextFieldDelegate委托,确保在加载视图后验证文本字段:
-(void) viewDidLoad {
textField1.delegate = self; //Note if these were created in a xib, you can do this in IB
textField2.delegate = self;
[self validateTextFields];
}
并实现textField:shouldChangeCharatersInRage:方法,以便每次textfileds更改时进行验证:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
[self validateTextFields];
return YES;
}
最后,根据需要进行实际验证并启用或禁用按钮:
-(void) validateTextFields {
if ((textField1.text.length > 0) && textField2.text.length > 0)) {
myUIButton.enabled = YES;
}
else {
myUIButton.enabled = NO;
}
}
答案 1 :(得分:3)
将自己设置为文本字段的委托并处理textFieldDidEndEditing:方法。在这种方法中,您可以进行验证:
- (void)textFieldDidEndEditing:(UITextField *)textField {
myButton.enabled = (myTextField1.text.length && myTextField2.length);
}
答案 2 :(得分:2)
我不喜欢布拉德的回答,因为你总是一个人物。由于shouldChangeCharactersInRange
的工作方式,您输入文本的最后一个文本字段必须至少包含两个字符。这是我发现更有帮助的解决方案:
夫特:
//This line goes in viewDidLoad
field.addTarget(self, action: #selector(self.validateTextFields), forControlEvents: UIControlEvents.EditingChanged)
func validateTextFields() {
if field.text != "" {
registerButton.enabled = true
} else {
registerButton.enabled = false
}
}
目标-C:
//This line goes in viewDidLoad
[myTextField addTarget:self
action:@selector(textFieldDidChange)
forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange
{
if ([self.myTextField.text isEqualToString:@""]) {
[self.button setEnabled:NO];
}
else {
[self.button setEnabled:YES];
}
}
该解决方案也不要求您将最近的字段作为第一响应者重新签名,我觉得这很有用,因为只要文本字段的文本从空字符串更改,按钮的状态就会改变发短信。
答案 3 :(得分:1)
基于Jacob的例子的Swift 3变体。
//
// ViewController.swift
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var txtTextField: UITextField!
@IBOutlet weak var btnButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Ensure that only valid changes to txtTextField enable btnButton
txtTextField.addTarget(self, action: #selector(self.validateTextField), for: UIControlEvents.editingChanged)
}
func validateTextField() {
let validValue = txtTextField.text!.trimmingCharacters(in: CharacterSet.whitespaces)
btnButton.isEnabled = validValue == "" ? false : true
}
}