使用动态数据初始化UITableView

时间:2011-11-06 22:57:25

标签: objective-c uitableview

我正在尝试在UITableView中显示朋友列表。

我正在加载好友:

- (void)viewDidLoad
{
  [super viewDidLoad];
  [self apiGraphFriends];
}

然后我将结果设置为:

- (void)request:(FBRequest *)request didLoad:(id)result 
{
friends = [[NSMutableArray alloc] initWithCapacity:1];
NSArray *resultData = [result objectForKey:@"data"];
if ([resultData count] > 0) {
    for (NSUInteger i=0; i<[resultData count]; i++) {
        [friends addObject:[resultData objectAtIndex:i]];
    }
} else {
    //[self showMessage:@"You have no friends."];
}

}

我正在实现所需的UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [friends count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:    (NSIndexPath *)indexPath
{
    //NSManagedObjectModel *friend [fetch

    FriendCell *cell = [tableView dequeueReusableCellWithIdentifier:   @"friendCell"];        

    cell.cellName.text = [friends objectAtIndex:indexPath.row];

return cell;
}

问题是在我的数据到达之前正在调用方法'cellForRowAtIndexPath',如何阻止表视图的自动初始化,并且只有在有数据时才初始化它?

7 个答案:

答案 0 :(得分:4)

tableview始终在启动时加载。相反,在数据加载完毕后,调用

[self.tableView reloadData];

这告诉tableView刷新,它再次调用cellForRowAtIndexPath和所有爵士乐。

答案 1 :(得分:2)

  

如何阻止表视图的自动初始化

你没有。表视图将在创建和显示时自动尝试加载其数据。但那应该不是问题。

  

只有当你有数据时才会初始化它。

数据准备就绪后,向表格视图发送reloadData消息。

答案 2 :(得分:1)

您是否记得要将部分数量从0更改为至少1?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

要对此进行全面测试,您可以使用以下代码

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Add your friend as you initialise the array
    NSMutableArray *array = [NSMutableArray arrayWithObjects:f1,nil];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.friends count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    //change this to whatever you need
    NSString *friend = [self.friends objectAtIndex:indexPath.row];  
    cell.textLabel.text = friend;

    return cell;
}

答案 3 :(得分:1)

如果您没有要显示的内容,则numberOfRowsInSection应返回0。加载数据并准备显示后,您应该在tableView上调用reloadData,然后才能显示数据。 numberOfRowsInSection现在应该给出您加载的行数。

简而言之,您不会阻止tableView初始化。您最初告诉它不显示任何数据,并且一旦加载了数据,您就会告诉它显示尽可能多的行。

答案 4 :(得分:1)

在您拥有数据之前,不要设置tableview委托和数据源。

-(void)viewDidLoad{
     [self apiGraphFriends];
     self.tableview.delegate = self;
     self.tableview.datasource = self;
}

我假设你的方法&#39; apiGraphFriends&#39;没有使用任何背景线程,也不是异步的。如果是,那么只需创建一个新方法并将数据源/委托设置放在那里,然后从apiGraphFriends方法中的块中调用它。

答案 5 :(得分:0)

一旦获得数据,只需调用tableView的 reloadData ,tableview将重新加载其数据,从而调用所有数据源方法以获取其数据。

答案 6 :(得分:-1)

你真是太近了!

- (void)viewDidLoad
{
  [self apiGraphFriends];
  [super viewDidLoad];
}

应该这样做。如果没有,您可以随时在tableView上调用reloadData