iOS 7 - 检测从另一个函数突出显示哪个textField

时间:2014-02-28 09:10:34

标签: ios objective-c

抱歉,我过去几个小时一直在研究这个问题。我在我的应用程序中使用MLPAutocomplete类作为自动完成文本字段。我在实现库时没有问题。但是,对于我的情况,我有四个文本字段,implementation that was described in the gitHub没有描述如何使用多个文本字段实现库。因此,为了向当前使用的文本字段提供正确的字符串数组,要检查四个文本字段中的哪一个被突出显示。以下是为自动填充文本字段提供数组的函数。

我基本上做的是在我的viewDidLoad方法中,我初始化了四个文本视图的四个数组,并在下面的函数中possiblecompleteionsForString,我做的是根据是否采用布尔值或不突出显示文本字段。基于此,我然后将正确的数组分配给完成数组(完成数组是文本字段中显示的数组)。但是,我注意到这在100%的时间都不起作用。在某些情况下,我的应用会显示不同的数组。例如,我为brandInput文本字段设置了一个文本,并尝试输入partInput textField,会发生的情况是日志显示以下内容:

2014-02-28 16:57:51.295 Database[7352:3f03] brand input Status active
2014-02-28 16:57:52.154 Database[7352:3f03] brand input Status active
2014-02-28 16:57:57.463 Database[7352:3f03] part input Status active 
2014-02-28 16:57:57.465 Database[7352:3f03] brand input Status active

它设法检测到brandInput textField处于活动状态,然后它还看到我切换到partInput textField。但是,由于一个未知的原因,它仍然作为活动的brandInput,给我一个错误的数组。

这是代码。

- (void)autoCompleteTextField:(MLPAutoCompleteTextField *)textField
 possibleCompletionsForString:(NSString *)string
            completionHandler:(void (^)(NSArray *))handler{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_async(queue, ^{

        NSMutableArray *completions = [[NSMutableArray alloc] init];
        [completions removeAllObjects];

        BOOL partInputStatus = partInput.highlighted;
        BOOL brandInputStatus = brandInput.highlighted;
        BOOL barcodeInputStatus = barcodeInput.highlighted;
        BOOL itemNameInputStatus = itemNameInput.highlighted;

        if(partInputStatus){
            NSLog(@"part input Status active");
            completions = [self part];
        }

        if(brandInputStatus){
            NSLog(@"brand input Status active");
            completions = [self brand];
        }

        if(barcodeInputStatus){
            NSLog(@"barcode input Status active");
            completions = [self barcode];
        }

        if(itemNameInputStatus){
            NSLog(@"itemname input Status active");
            completions = [self itemName];
        }

        handler(completions);
    });
}

我该怎么做?我认为将brand标记为非活动状态不会起作用,因为Boolean变量会在函数开头重新初始化。

有没有其他方法可以检测哪个textField处于活动状态?我已经看到了一些解决方案,但是,这些是委托函数,我认为我不能从我的函数中调用它们。

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

这可能适合您的情况:BOOL partInputStatus = [partInput canResignFirstResponder];

OR

Matthias建议

BOOL partInputStatus = [partInput isFirstResponder];

如果输入字段是聚焦的(用户当前正在编辑它),它可以重新签名它的第一响应者状态(即关闭键盘并转到它的正常状态)。

答案 1 :(得分:0)

您可以这样做:

设置autocompleteTextField的标记。

由于这些是UITextField的扩展版本,因此它将调用textFieldDidBeginEditing:(UITextField*)textField委托。从那里你可以检查哪个字段是活动的。

例如:

partInput.tag = 1;
brandInput.tag = 2;
barcodeInput.tag = 3;
itemNameInput.tag = 4;

和int textFieldDidBeginEditing:

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    if (textField.tag == 1) {
        //partInput
    }
    else if (textField.tag == 2) {
        //brandInput
    }
    else if (textField.tag == 3) {
        //barcodeInput
    }
    else if (textField.tag == 4) {
        //ItemNameInput
    }

}

希望这会有所帮助.. :)