如何将UIView添加到View作为子视图(用于提供用户反馈)

时间:2011-05-24 08:36:53

标签: iphone ios

我正在创建一个费率鱼应用程序。当用户评价鱼时,我想显示一个小方框,上面写着“平均评分: * ”和星星。

我在表格的单元格中实现了类似的功能,但似乎无法在普通视图中使用它(我运行以下代码,视图中没有任何内容):

-(void)displayAvg:(NSInteger)avg{
    UILabel *text = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 90, 20)];
    text.text = @"Average Rating:";

    UIView *wrapper = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 100, 30)];
    wrapper.layer.cornerRadius = 8;
    wrapper.backgroundColor = [UIColor whiteColor];

    [wrapper addSubview:text];
    [text release];

    UIImageView *star;
    NSInteger ratingI = avg;

    for(int i = 0; i<ratingI; i++) {
        star = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"little_star.png"]];
        star.frame = CGRectMake(50 + (i * 16), 0, 16, 16);
        [wrapper addSubview:star];
        [star release];
    }

    [self.view addSubview:wrapper];
    [self.view bringSubviewToFront:wrapper];
    NSLog(@"Sleeping...");
    [NSThread sleepForTimeInterval:3];

    [wrapper removeFromSuperview];
    [wrapper release];
}

2 个答案:

答案 0 :(得分:1)

这不是你的问题的答案,但我认为最好添加将在3秒内触发的计时器,然后移除窗口;你不会这样阻止线程;您是否尝试首先添加简单的子视图,即没有其他代码的包装器?它会出现吗?或者实际上当我重新思考问题时,它可能是你问题的答案 - 阻塞线程这种方式可能是窗口永远不会显示的原因。到目前为止,我知道UI将在线程返回到运行循环后更新。

答案 1 :(得分:1)

我试过这段代码问题出在以下一行

 [NSThread sleepForTimeInterval:3];

因此,不是这一行,而是编写一个新方法并使用'wrapper'作为参数调用它来删除包装器视图。

[self performSelector:@selector(removeWrapper:) withObject:wrapper afterDelay:3];

实施方法

-(void)removeWrapper:(id)sender
{
    UIView *wrapper = sender;
    [wrapper removeFromSuperview];
    [wrapper release];
}