将子视图添加到UITextField leftView属性

时间:2010-05-13 20:34:11

标签: iphone ipad uitextfield

我正在尝试为iPhone / iPad实现自动填充文本字段。我已经将UITextField子类化了。当用户输入搜索条件时,如果搜索字符串与我们数据库中的某个实体匹配,那么该实体将成为用户搜索条件的一部分,并且我想将表示该实体的按钮附加到文本字段的leftView属性。这样,当用户输入更多搜索条件时,在将联系人输入到to / cc字段时,以与邮件编辑器类似的方式将项目附加到左视图。

我的问题是leftView没有显示任何内容。我可以通过在leftView上设置frame属性来增加leftView的大小。但是我添加的任何子视图(例如UIImageView或UIButton)都不会显示在文本字段的左视图中。当我向左视图添加子视图并设置左视图的框架时,文本字段的光标确实向右移动,但没有任何内容可见。

我创建了一个新的UIView并将leftView设置为该视图。

然后我创建新的UIButton对象并将它们作为子视图添加到leftView。

我在layoutSubviews中设置了按钮和左视图的帧。

leftView肯定会增加大小,文本字段光标会向右移动。

但是,没有任何按钮显示(不可见)。

必须有一些我不理解的左视图。

以下是代码段:

    // 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 个答案:

答案 0 :(得分:1)

我想出来了。我没有在layoutSubviews覆盖中调用[super layoutSubviews]。现在它正确呈现了leftview的子视图。以前,我只是在layoutSubview中调用[leftView layoutSubviews],但是没有用。