确保用户在UIBarButton在UINavigationBar中可选之前填充了UIViewController中的两个UITextFields

问题描述:

我有一个简单的UIViewController,其中包含一些UITextField。顶部的导航栏有一个UIBarButtonItem(在Storyboard中创建),它被称为保存最终允许用户保存他们正在输入的条目,因此关闭此UIViewController确保用户在UIBarButton在UINavigationBar中可选之前填充了UIViewController中的两个UITextFields

我想强制用户必须至少输入2或3个文本字段才能保存按钮变为可选,所以它在那里,但灰色直到用户填写两个指定的文本字段。

我将如何实现这样的目标?

对于这个小问题,我很抱歉,但实际上并没有比这更多的东西;灰色的BarButtonItem直到字段已被填充,然后允许用户点击它。我在网上搜索,非常意外地找不到这方面的很多信息。

任何指导将非常感激。

更新。我曾尝试加入:

self.navigationItem.rightBarButtonItem.enabled = NO;viewDidLoadviewWillAppear只是为了看看我是否能启动禁用我的栏按钮项目,它不会禁用的。

+0

我希望我的回答可以帮助你。 –

+1

它认真地做了 - 非常感谢Garbiel! – amitsbajaj

创建的所有东西故事板

首先,您需要IBActionIBOutlet为您的UIBarButton。你可以这样做,在您的m

@interface ViewController() 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *myBarButtonItem; 
@end 

和:

- (IBAction)myBarButtonItemAction:(id)sender 
{ 
    // your code 
} 

我会假设你有的Xcode Interface Builder的创建2 UITextField,然后将其添加为IBOutlet你。L:

@property (strong, nonatomic) IBOutlet UITextField *myTextFieldOne; 
@property (strong, nonatomic) IBOutlet UITextField *myTextFieldTwo; 

此行添加到viewDidLoad禁用UIBarButton

self.myBarButtonItem.enabled = FALSE; 

为了把你UITextField你可以做两种方式控制:

首先UITextFieldDelegate一个,将此代码添加到.m

@interface ViewController() <UITextFieldDelegate> 

您可以检查UITextFieldDelegate Protocol Reference here

而你需要委托方法是这两个中的一个,这取决于你想要什么来实现的:

– textFieldDidBeginEditing: 
– textFieldDidEndEditing: 

但是我不喜欢这种方法,因为textFieldDidBeginEditing:有人可以开始编辑并永远不会输入文字。随着textFieldDidEndEditing:你需要打电话来解雇键盘:[self.myTextFieldOne resignFirstResponder]。您也可以/应该执行另一个UITextFieldDelegate谁采取的控制权的“返回”键– textFieldShouldReturn:

如果你决定使用UITextFieldDelegate记得补充:

self.myTextFieldOne.delegate = self; 
self.myTextFieldTwo.delegate = self; 

然后,我的第二个选项是增加该行代码viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkTextFields) name:UITextFieldTextDidChangeNotification object:nil]; 

在这里,您收到一个通知,您的SEL每次文字是茶nged成UITextField

则:

- (void) checkTextFields 
{ 
    // Add here your logic to check TextFields and decide if they have text 
    if ([self.myTextFieldOne.text length] != 0 && [self.myTextFieldTwo.text length] != 0) 
    { 
     self.myBarButtonItem.enabled = TRUE; 
    } 
    else 
    { 
     self.myBarButtonItem.enabled = FALSE; 
    } 
} 

可以检查small demo with my second option here.

+1

亲爱的加百列 - 非常感谢你的出色答案。我沿着通知中心的路线走了,因为你对第一种方法是正确的,有人正在点击文本字段,而不是输入任何内容,也是实现我的第一个NSNotificationCenter代码的机会,也是学习它的好机会。它的作用像一个绝对的魅力,我不能够感谢你。我非常感谢你对此的出色帮助。如果可以的话,我会给你两次投票!再次感谢! – amitsbajaj

+0

很高兴。 –

可以通过所述方法之一

  1. 在viewDidLoad中()方法禁用的UITextField检查为条件的UIBarbutton
  2. 委托方法达到相同的。 您可以通过声明一个变量并随后递增计数 UITextFielddelegate'textFieldShouldReturn'方法来实现此目的。
  3. 条件满足后,启用保存UIBarButton。

希望这会有所帮助。

+0

感谢您的回复。这非常有帮助。一个简单的问题 - 我如何设置UIBarButton项目在viewDidLoad中被禁用?它是在Storyboard中创建的,并且有一个IBAction附加到按钮而不是IBOutlet。 – amitsbajaj

+0

另外,我应该检查哪个UITextField的委托方法? – amitsbajaj

+0

对不起,我刚刚更新了我试过的问题 – amitsbajaj