UINavigationBar按钮未在正确的逻辑中禁用和启用

时间:2014-04-15 14:05:13

标签: ios uitextfield uitextview uisegmentedcontrol

我有一个简单的应用程序,用户将信息输入到一系列UITextFields和一些其他组件中,以便应用程序填充信息。

我有4个UITextFields(姓名,事件,收入和金额),1个UITextView(备注),UIDatePickerUISegmentedControl(状态)。

需要名称,事件,金额和状态,其中Subevent和Notes是可选的。

如果没有填写必填字段,我已经设置了一些逻辑来禁用“保存”BarButtonItem;但是我注意到我的逻辑没有正常工作。

这是逻辑:

- (void) checkTextFields
{
    if (([self.nameTextField.text length] != 0 && [self.itemTextField.text length] != 0 && [self.occasionTextField.text length] != 0 && [self.isReceivedSegment selectedSegmentIndex] == 0) || [self.isReceivedSegment selectedSegmentIndex] == 1)
    {
        NSLog(@"This shouldn't be run if not every field is filled in");
        self.saveButton.enabled = TRUE;
    }
    else
    {
        NSLog(@"Run");
        self.saveButton.enabled = FALSE;
    }
}

我是从viewDidLoad中调用它的:

self.saveButton.enabled = FALSE;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkTextFields) name:UITextFieldTextDidChangeNotification object:nil];

[self.isReceivedSegment addTarget:self action:@selector(checkTextFields) forControlEvents:UIControlEventValueChanged];

问题

问题是:如果我在SegmentedControl中输入Name,Event和Select a Segment,它不应该启用Save按钮,因为Amount没有填写。

如果我输入Name,Amount和Select a Segment,同样适用,不应填写Save按钮,因为事件未填写,但是,这两种情况都是如此。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

- (void) checkTextFields
{
    if ([self.nameTextField.text length] != 0 && [self.itemTextField.text length] != 0 && [self.occasionTextField.text length] != 0 && ([self.isReceivedSegment selectedSegmentIndex] == 0 || [self.isReceivedSegment selectedSegmentIndex] == 1))
    {
        NSLog(@"This shouldn't be run if not every field is filled in");
        self.saveButton.enabled = TRUE;
    }
    else
    {
        NSLog(@"Run");
        self.saveButton.enabled = FALSE;
    }
}

使用括号实现条件的方式,当selectedSegmentIndex = 1时,无论其他条件如何,它都将评估为true。像这样移动括号应该有效。

请注意,我已移动括号以包围条件的OR部分。

编辑将这些行添加到您的视图中加载方法以在编辑任何文本字段后检查表单。

[nameTextField addTarget:self action:@selector(checkTextFields) forControlEvents:UIControlEventEditingChanged];

[itemTextField addTarget:self action:@selector(checkTextFields) forControlEvents:UIControlEventEditingChanged];

[occasionTextField addTarget:self action:@selector(checkTextFields) forControlEvents:UIControlEventEditingChanged];