我正在尝试在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',如何阻止表视图的自动初始化,并且只有在有数据时才初始化它?
答案 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
。