我正在创建一个费率鱼应用程序。当用户评价鱼时,我想显示一个小方框,上面写着“平均评分: * ”和星星。
我在表格的单元格中实现了类似的功能,但似乎无法在普通视图中使用它(我运行以下代码,视图中没有任何内容):
-(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];
}
答案 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];
}