我正在设置一个设置屏幕,您可以通过uisearchbar选择电台。我有一个分段的tableview,一个站的第一个字母作为标题,每个站都按照它的第一个字母分类。到现在为止还挺好。 我有2个NSMutableArray,每个部分都有电台。一个是未经过滤的数组(当我没有过滤时我使用它)和另一个,当我在搜索某些东西时。 (我是通过谓词来做的)。在键盘上的每个按键上我都做了[self.tableView reloadData];这是有效的,但滚动视图仍然太长!因此,您可以滚动浏览所选数组中实际有多少结果。这会导致崩溃,因为它试图获取不存在的对象。
所以看起来tableview没有计算数组的权利或什么? 有人熟悉这个问题吗?
以下是一些代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if (self.searching) {
return [self.tableFilterd count];
} else {
return [self.tableData count];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSLog(@"Rows for section");
// Return the number of rows in the section.
if (self.searching) {
NSLog(@"Editing section: %i, count %i", section, [[self.tableFilterd objectAtIndex:section] count]);
return [[self.tableFilterd objectAtIndex:section] count];
} else {
NSLog(@"Not editing");
return [[self.tableData objectAtIndex:section] count];
}
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
SettingsHeaderCell *cell = [[[SettingsHeaderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"HeaderCell"] autorelease];
cell.labelLetter.text = [[self.tableLetters objectAtIndex:section] capitalizedString];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 40;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 52;
}
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
SettingsCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[SettingsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
if (self.searching) {
StationObject *object = (StationObject *)[[self.tableFilterd objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
[cell setStationObject:object];
} else {
StationObject *object = (StationObject *)[[self.tableData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
[cell setStationObject:object];
}
return cell;
}
答案 0 :(得分:0)
你现在可能已经解决了这个问题,但我怀疑你没有清空这两个阵列。在方法中:
- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText
{
//Remove all objects first
[self.tableFiltered removeAllObjects];
[self.tableData removeAllObjects];
另外你只需要调用[self.tableView reloadData];在textDidChange中,不在其他三种方法中。希望这会有所帮助。