如何在UITableView的节头视图中访问UIActivityIndi​​catorView?

时间:2010-01-13 21:43:30

标签: iphone uitableview

我想用UITableView做一些非常简单的事情:我想在一个部分的标题视图中添加一个UIActivityIndi​​catorView,并在需要时使其生动或消失。

使用tableView将jIActivityIndi​​catorView添加到标题视图时没有问题:viewForHeaderInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 60.0)];

// create the title
UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 12.0, 310.0, 22.0)];
headerLabel.text = @"some random title here";

[customView addSubview:headerLabel];
[headerLabel release];

// Add a UIActivityIndicatorView in section 1
if(section == 1)
{
    [activityIndicator startAnimating];
    [customView addSubview:activityIndicator];
}

return [customView autorelease];

}

activityIndi​​cator是我的控制器类的属性。 我在viewDidLoad方法中分配它:

- (void)viewDidLoad 
{ 
(...)
activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(200, 10, 25, 25)];
}

这样我就可以随时向它发送消息(比如-startAnimating或-stopAnimating)。 问题是,当我滚动tableView时,activityIndi​​cator就会消失(我想这是因为第二次调用tableView:viewForHeaderInSection:方法)。

我还能如何在该部分的标题视图中添加activityIndi​​catorView,并且之后仍可以向其发送消息? (当我向下滚动时,activityIndi​​cator没有消失)

非常感谢!

2 个答案:

答案 0 :(得分:0)

如果您尝试在多个位置使用相同的活动指示器,那么它可能会从一个地方移动到另一个地方。我相信你需要一个不同的部分标题。您可能希望使用MutableArray来跟踪您创建的标题视图,这样如果您在数组中找到一个没有超级视图的标题视图,就可以重用它们,有点像是出列并重用单元格。

这只是猜测,因为我没有这样做,但我很确定问题是尝试在多个地方重复使用相同的视图。

答案 1 :(得分:0)

这个问题似乎是由每次调用tableView:viewForHeaderInSection:重新创建一个customView并将activityIndi​​cator添加为子视图引起的。

不使用子视图帮我解决了问题:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

// Add a UIActivityIndicatorView in section 1
if(section == 1)
{
    [activityIndicator startAnimating];
    return activityIndicator;
}

    UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 60.0)];

// create the title
UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15.0, 12.0, 310.0, 22.0)];
headerLabel.text = @"some random title here";

[customView addSubview:headerLabel];
[headerLabel release];


return [customView autorelease];
}

(看起来很丑陋,activityIndi​​cator占用了该部分的整个宽度。我最好为第1部分创建一个独特的customView,并将activityIndi​​cator一次性添加为一个subView。)