Добавление подпредставлений в свойство leftView UITextField - PullRequest
0 голосов
/ 14 мая 2010

Я пытаюсь реализовать автозаполнение текстового поля для iPhone / iPad. Я подкласс UITextField. Когда пользователь вводит критерии поиска, если строка поиска соответствует некоторой сущности в нашей базе данных, тогда эта сущность становится частью критериев поиска пользователя, и я хочу добавить кнопку, представляющую эту сущность, к свойству leftView текстового поля. Таким образом, когда пользователь вводит больше критериев поиска, элементы добавляются в левое представление аналогично редактору почты при вводе контактов в поля to / cc.

Моя проблема в том, что leftView ничего не показывает. Я могу увеличить размер leftView, установив свойство frame в leftView. Но любые подвиды, которые я добавляю (например, UIImageView или UIButton), НЕ отображаются в левой части текстового поля. Курсор текстового поля перемещается вправо, когда я добавляю подпредставления в левое представление и устанавливаю рамку левого представления, но ничего не видно.

Я создаю новый UIView и устанавливаю leftView для этого представления.

Затем я создаю новые объекты UIButton и добавляю их в качестве подпредставлений в левое представление.

Я устанавливаю рамки кнопок и левого обзора в layoutSubviews.

Левый вид определенно увеличивается в размере, и курсор текстового поля перемещается вправо, как и должно.

Но ни одна из кнопок не отображается (они не видны).

В левом видении должно быть что-то, чего я не понимаю.

Вот фрагмент кода:

    // add search criteria to the left view 
// this will create a button on the left side of the text field
(void) addSubValue:(NSString*) value display:(NSString*)display
{
    if(subValues==nil)
    {
        NSMutableArray * tmp=[[NSMutableArray alloc] init];

        self.subValues=tmp;

        [tmp release];
    }

    AutocompleteSubValue * subValue =[[AutocompleteSubValue alloc] init];

    subValue.value=value;
    subValue.display=display;

    UIButton * button=[UIButton buttonWithType:UIButtonTypeRoundedRect];

    button.frame=CGRectMake(0, 0, 100, 30); // this frame gets reset later in layoutSubviews...
    button.titleLabel.text=display;
    button.titleLabel.textColor=[UIColor whiteColor];
    button.titleLabel.backgroundColor=[UIColor blueColor];
    button.backgroundColor=[UIColor blueColor];

    [button addTarget:self action:@selector(touchSubValue:) forControlEvents:UIControlEventTouchUpInside];

    subValue.view=button;

    [self.leftView addSubview:button];


    [subValues addObject:subValue];
    [subValue release];

    [self setNeedsLayout];
}

(void) touchSubValue:(id)sender
{
    UIButton * button=sender;
    // find value user touched and remove from the search
    AutocompleteSubValue * subValue;
    for (AutocompleteSubValue * s in subValues)
    {
        if([s.view isEqual:button])
        {
            subValue=s;
            break;
        }
    }
    if(subValue)
    {
        [button removeFromSuperview];
        [subValues removeObject:subValue];
    }
}

(void)layoutSubviews
{
    if(self.leftView==nil)
    {
        UIView * view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 30)]; // this views frame gets reset in layoutSubviews
        self.leftView = view;
        self.leftViewMode = UITextFieldViewModeAlways;
        [view release];
    }

    CGFloat left=30;

    // set frames of sub values
    for (AutocompleteSubValue * subValue in subValues)
    {
        CGFloat display_width=100+16; // TODO: get from display text

        CGFloat height=30;

        CGRect frame=CGRectMake(left, 4, display_width, height);

        subValue.view.frame=frame;

        left+=display_width+10;
    }

    // set width of left view to make room for buttons, and move cursor to the right
    self.leftView.frame=CGRectMake(self.leftView.frame.origin.x, self.leftView.frame.origin.y, left, self.leftView.frame.size.height);

    [self.leftView layoutSubviews];
}

1 Ответ

1 голос
/ 14 мая 2010

Я понял это. Я не вызывал [super layoutSubviews] в переопределении layoutSubviews. Теперь он правильно отображает подпредставления левого обзора. Раньше я просто вызывал [leftView layoutSubviews] в layoutSubview, но это не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...