MLPAutoCompleteTextField 建议 table 交互问题

MLPAutoCompleteTextField suggestion table interaction issue

目前我正在我的项目中使用这个第三方库https://github.com/EddyBorja/MLPAutoCompleteTextField。该库用于根据用户输入显示建议列表。

我确实像这样设置了文本字段

    self.searchTextField = [[MLPAutoCompleteTextField alloc] initWithFrame:CGRectMake(0, 0, 250, 30)];
[self.searchTextField setBorderStyle:UITextBorderStyleRoundedRect];
self.searchTextField.backgroundColor = [UIColor whiteColor];
self.searchTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
self.searchTextField.textColor = [UIColor blackColor];
self.searchTextField.returnKeyType = UIReturnKeyDone;
self.searchTextField.placeholder = @"Enter name to search";
self.searchTextField.autocorrectionType = UITextAutocorrectionTypeNo;

self.searchTextField.delegate = self;
self.searchTextField.autoCompleteDelegate = self;
self.searchTextField.autoCompleteDataSource = self;

如下实现数据源协议

- (NSArray *)autoCompleteTextField:(MLPAutoCompleteTextField *)textField possibleCompletionsForString:(NSString *)string {
return @[@"AAA", @"BBB", @"CCC", @"DDD"];

当我在文本字段中输入内容时,显示了下拉列表,但是当我点击下拉列表中的单元格时,列表消失了,没有完成文本字段中的任何单词。

任何遇到过这个问题的人请向我解释我哪里错了。提前致谢。

我前一段时间遇到了同样的问题。我碰巧在 UITableView 中使用 MLPAutocomleteTextField,因此所有触摸事件都可能被 tableview 拦截。

我解决了这个问题,方法是将我的 MLPAutocomleteTextField 实例的 autoCompleteTableAppearsAsKeyboardAccessory 设置为 TRUE 以启用自动完成作为键盘附件。这让我可以 select 我的自动完成选项。希望这也能解决您的问题。 :)

我通过子类化我的 UITableViewCell 解决了这个问题,有点棘手,但它对我有用:

#import "AutoCompleteTableViewCell.h"

@interface AutoCompleteTableViewCell()
@property (nonatomic, assign) BOOL selectedCell;
@end

@implementation AutoCompleteTableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
    self.selectedCell = NO;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView* hitView = [super hitTest:point withEvent:event];
    if (hitView != nil)
    {
        [self.superview bringSubviewToFront:self];
    }
    return hitView;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect rect = self.bounds;
    BOOL isInside = CGRectContainsPoint(rect, point);
    if(!isInside)
    {
        for (UIView *view in self.subviews)
        {
            isInside = CGRectContainsPoint(view.frame, point);
            if(isInside)
                break;
        }
    }
    if (!self.selectedCell) {
        self.selectedCell = YES;
        id view = [self superview];
        while (view && [view isKindOfClass:[UITableView class]] == NO) {
            view = [view superview];
        }
        UITableView *tableView = (UITableView *)view;
        NSIndexPath *indexPath = [tableView indexPathForCell:self];
        [tableView.delegate tableView:tableView didSelectRowAtIndexPath:indexPath];
    }
    return isInside;
}

然后调用委托方法:

- (void)autoCompleteTextField:(MLPAutoCompleteTextField *)textField
  didSelectAutoCompleteString:(NSString *)selectedString
       withAutoCompleteObject:(id<MLPAutoCompletionObject>)selectedObject
            forRowAtIndexPath:(NSIndexPath *)indexPath;