Я пытаюсь реализовать автозаполнение текстового поля для 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];
}