移动可扩展 table 视图时出错?
Getting error while moving expandable table view?
我在上下移动可扩展 table 视图时遇到错误。
这是我的错误
* 由于未捕获的异常 'NSRangeException' 而终止应用程序,原因:'* -[__NSSingleObjectArrayI objectAtIndex:]:索引 3 超出范围 [0 .. 0]'
arr = [[NSArray alloc]initWithObjects:@"obj1",@"obj2",@"obj3",@"obj4",nil];
arr1 = [[NSArray alloc]initWithObjects:@"Name1", @"name2", @"name3", @"name4", @"name5", @"name6", nil];
arr2 = [[NSArray alloc]initWithObjects:@"arr2obj", nil];
arr3 = [[NSArray alloc]initWithObjects:@"arr3obj", nil];
arr4 = [[NSArray alloc]initWithObjects:@"arr4obj", nil];
这是我的代码...
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:section]])
{
if (section == 0) {
return arr1.count;
} else if (section == 1) {
return arr2.count ;
} else if (section == 2) {
return arr3.count;
}else if (section == 3) {
return arr4.count;
}
} else {
return 0;
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ViewControllerCell *cell; // = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell"];
cell= (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell" forIndexPath:indexPath];
cell.faqLbl.text = [tempArr objectAtIndex:indexPath.row];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection: (NSInteger)section
{
ViewControllerCellHeader *headerView = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCellHeader"];
headerView.faqLblTitle.numberOfLines = 0;
headerView.faqLblTitle.lineBreakMode = NSLineBreakByWordWrapping;
headerView.faqLblTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:15.0];
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
headerView.faqLblTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:25.0];
}
if (headerView ==nil)
{
[tblView registerClass:[ViewControllerCellHeader class] forCellReuseIdentifier:@"ViewControllerCellHeader"];
headerView = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCellHeader"];
}
headerView.faqLblTitle.text = [arr objectAtIndex:section];
if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:section]])
{
headerView.faqBtnShowHide.selected = YES;
}
[[headerView faqBtnShowHide] setTag:section];
headerView.faqBtnShowHide.tag = section;
[[headerView faqBtnShowHide] addTarget:self action:@selector(btnTapShowHideSection:) forControlEvents:UIControlEventTouchUpInside];
return headerView.contentView;
}
-(IBAction)btnTapShowHideSection:(UIButton*)sender
{
if (!sender.selected)
{
[arrSelectedSectionIndex addObject:[NSNumber numberWithInteger:sender.tag]];
sender.selected = YES;
}else{
sender.selected = NO;
if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:sender.tag]])
{
[arrSelectedSectionIndex removeObject:[NSNumber numberWithInteger:sender.tag]];
}
}
[tblView reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationAutomatic];
}
- (IBAction)dropDownButton:(UIButton *)sender {
if(sender.tag == 0) {
tempArr = arr1;
} else if (sender.tag == 1) {
tempArr = arr2;
} else if (sender.tag == 2) {
tempArr = arr3;
} else if (sender.tag == 3) {
tempArr = arr4;
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section == 0) {
tempArr = arr1;
} else if (indexPath.section == 1) {
tempArr = arr2;
} else if (indexPath.section == 2) {
tempArr = arr3;
} else if (indexPath.section == 3) {
tempArr = arr4;
}
ViewControllerCell *cell; // = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell"];
cell= (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell" forIndexPath:indexPath];
cell.faqLbl.text = [tempArr objectAtIndex:indexPath.row];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
您在未初始化的情况下调用重新加载部分 tempArr
numberOfRowsInSection
正在考虑实际数据源,如 arr1、arr2 等,但 cellForRowAtIndexPath
取决于 tempArr
来填充单元格.显然,如果 tempArr 的值与返回单元格数量的实际数据源不同,它将中断。
我在上下移动可扩展 table 视图时遇到错误。 这是我的错误 * 由于未捕获的异常 'NSRangeException' 而终止应用程序,原因:'* -[__NSSingleObjectArrayI objectAtIndex:]:索引 3 超出范围 [0 .. 0]'
arr = [[NSArray alloc]initWithObjects:@"obj1",@"obj2",@"obj3",@"obj4",nil];
arr1 = [[NSArray alloc]initWithObjects:@"Name1", @"name2", @"name3", @"name4", @"name5", @"name6", nil];
arr2 = [[NSArray alloc]initWithObjects:@"arr2obj", nil];
arr3 = [[NSArray alloc]initWithObjects:@"arr3obj", nil];
arr4 = [[NSArray alloc]initWithObjects:@"arr4obj", nil];
这是我的代码...
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:section]])
{
if (section == 0) {
return arr1.count;
} else if (section == 1) {
return arr2.count ;
} else if (section == 2) {
return arr3.count;
}else if (section == 3) {
return arr4.count;
}
} else {
return 0;
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ViewControllerCell *cell; // = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell"];
cell= (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell" forIndexPath:indexPath];
cell.faqLbl.text = [tempArr objectAtIndex:indexPath.row];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection: (NSInteger)section
{
ViewControllerCellHeader *headerView = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCellHeader"];
headerView.faqLblTitle.numberOfLines = 0;
headerView.faqLblTitle.lineBreakMode = NSLineBreakByWordWrapping;
headerView.faqLblTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:15.0];
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
headerView.faqLblTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:25.0];
}
if (headerView ==nil)
{
[tblView registerClass:[ViewControllerCellHeader class] forCellReuseIdentifier:@"ViewControllerCellHeader"];
headerView = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCellHeader"];
}
headerView.faqLblTitle.text = [arr objectAtIndex:section];
if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:section]])
{
headerView.faqBtnShowHide.selected = YES;
}
[[headerView faqBtnShowHide] setTag:section];
headerView.faqBtnShowHide.tag = section;
[[headerView faqBtnShowHide] addTarget:self action:@selector(btnTapShowHideSection:) forControlEvents:UIControlEventTouchUpInside];
return headerView.contentView;
}
-(IBAction)btnTapShowHideSection:(UIButton*)sender
{
if (!sender.selected)
{
[arrSelectedSectionIndex addObject:[NSNumber numberWithInteger:sender.tag]];
sender.selected = YES;
}else{
sender.selected = NO;
if ([arrSelectedSectionIndex containsObject:[NSNumber numberWithInteger:sender.tag]])
{
[arrSelectedSectionIndex removeObject:[NSNumber numberWithInteger:sender.tag]];
}
}
[tblView reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationAutomatic];
}
- (IBAction)dropDownButton:(UIButton *)sender {
if(sender.tag == 0) {
tempArr = arr1;
} else if (sender.tag == 1) {
tempArr = arr2;
} else if (sender.tag == 2) {
tempArr = arr3;
} else if (sender.tag == 3) {
tempArr = arr4;
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section == 0) {
tempArr = arr1;
} else if (indexPath.section == 1) {
tempArr = arr2;
} else if (indexPath.section == 2) {
tempArr = arr3;
} else if (indexPath.section == 3) {
tempArr = arr4;
}
ViewControllerCell *cell; // = [tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell"];
cell= (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewControllerCell" forIndexPath:indexPath];
cell.faqLbl.text = [tempArr objectAtIndex:indexPath.row];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
您在未初始化的情况下调用重新加载部分 tempArr
numberOfRowsInSection
正在考虑实际数据源,如 arr1、arr2 等,但 cellForRowAtIndexPath
取决于 tempArr
来填充单元格.显然,如果 tempArr 的值与返回单元格数量的实际数据源不同,它将中断。