ios - 在 UINavigationBar 中的 UIBarButton 是 Selectable 之前,确保用户在 UIViewController 中填写了两个 UITextField

标签 ios uitextfield uinavigationbar uibarbuttonitem uitextfielddelegate

我有一个简单的 UIViewController,其中包含一些 UITextField。顶部的导航栏有一个名为 SaveUIBarButtonItem(在 Storyboard 中创建),它最终允许用户保存他们正在输入的条目并因此关闭这个 UIViewController

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

我怎样才能实现这样的目标?

对于这个小问题,我很抱歉,但实际上没有比这更重要的了;将 BarButtonItem 变灰,直到字段已填写,然后允许用户单击它。我在网上搜索过,但令人惊讶的是找不到太多关于这方面的信息。

任何指导将不胜感激。

更新。我尝试添加:

self.navigationItem.rightBarButtonItem.enabled = NO;viewDidLoadviewWillAppear 只是为了看看我是否可以开始禁用我的栏按钮项目,它根本不会被禁用。

最佳答案

使用 Storyboard创建的所有内容。

首先,您的UIBarButton 需要IBActionIBOutlet。你可以在你的 .m 中做到这一点

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

和:

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

我假设您使用 Xcode Interface Builder 创建了 2 个 UITextField,然后将它们作为 IBOutlet 添加到您的 .m:

@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 .

而您需要的委托(delegate)方法是这两者之一,具体取决于您要实现的目标:

– 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];

每次文本更改为 UITextField 时,您都会收到 SEL 的通知

然后:

- (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.

关于ios - 在 UINavigationBar 中的 UIBarButton 是 Selectable 之前,确保用户在 UIViewController 中填写了两个 UITextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22809468/

相关文章:

objective-c - 导航栏左侧按钮的问题

ios - 解析 JSON 数据并处理数组

ios - 自动布局: Create constraint between two views in separate windows

iphone - 通过添加clickedButtonAtIndex导致UIAlertView崩溃

ios - 尝试将 UITextField 格式化为仅在 iOS 中用于数字输入的货币计算器

ios - Swift 计算 UITextFields 的值并返回值

swift - 如何将导航栏后退按钮图像设置为默认符号?

iphone - 创建 View Controller 时,我没有选中 Targeted for iPad 选项。如何使用 XCode 4.2 修复我的 UIView 以针对 iPad 设备?

ios - 无法在 iOS 9 beta/9.3 上更改 WKWebView 的滚动率

iphone - 导航 Controller 的 leftBarButtonItem 中有多个按钮