Objective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]' 用于 UITextField
Posted
技术标签:
【中文标题】Objective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]\' 用于 UITextField【英文标题】:Objective-C -[__NSArrayM insertObject:atIndex:]: index 2 beyond bounds [0 .. 0]' for UITextFieldObjective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]' 用于 UITextField 【发布时间】:2016-02-25 09:48:55 【问题描述】:我有一个表格视图,在我放置 UITextField 的两个部分中有两个部分。但是当我为每个 textField 使用标签时,它为两个部分共享相同的标签,因此我的应用程序崩溃了。如果第 1 部分包含 4 个 TextField,而第 2 部分包含大约 2 个 TextField。
- (void)textFieldDidEndEditing:(UITextField *)textField
if (Array1)
[Array1 setObject:textField.text atIndexedSubscript:[textField tag]-1];
NSLog(@"Array1 after edit: %@",Array1);
if (Array2)
[Array2 setObject:textField.text atIndexedSubscript:[textField tag]-1]; // app crashing at this line
NSLog(@"Array2 after edit: %@",Array2);
它给出了这个错误
* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM setObject:atIndex:]: index 2 beyond 界限 [0 .. 0]'
*** 首先抛出调用栈:
我的 taleView 代码是这样的
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 2; //count of section
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (section == 0 )
return [Array1 count];
else
return [Array2 count];
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
CustomCell *cell=(CustomCell *)[ProfileTable dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomeCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
if (indexPath.section==0)
[cell.SInfoTxt setPlaceholder:[[ProfileTableArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
cell.SInfoTxt.text=[Array1 objectAtIndex:indexPath.row];
else
[cell.SInfoTxt setPlaceholder:[[profileTblCustomArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
cell.SInfoTxt.text=[Array2 objectAtIndex:indexPath.row];
cell.SInfoTxt.tag=indexPath.row+1;
//set cell background clear color
cell.backgroundColor=[UIColor clearColor];
return cell;
【问题讨论】:
您如何以及在何处初始化 Array1 和 Array2 ?您是否从代码中的任何位置将 nil 设置为这些数组? 我在我的 .h 文件中将 Array1 和 Array2 初始化为 NSMutableArray,当我输入任何文本时,它会获取该 txt 并仅在我按此顺序单击第 1、2、3 个 UITextFiled 时才显示在我的文本文件中,并且但是如果我单击任何随机文本字段,它就会崩溃......而且我没有在这个问题中添加我的所有代码 【参考方案1】:除了在UITextfield
委托中使用标签,您可以使用它的框架原点来知道它的单元格索引路径。
- (void)textFieldDidEndEditing:(UITextField *)textField
CGPoint origin = textField.frame.origin;
CGPoint point = [textField convertPoint:origin toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];
if (indexPath.section==0)
[Array1 setObject:textField.text atIndexedSubscript:[textField tag]-1];
NSLog(@"Array1 after edit: %@",Array1);
if (indexPath.section==1)
[Array2 setObject:textField.text atIndexedSubscript:[textField tag]-1];
NSLog(@"Array2 after edit: %@",Array2);
【讨论】:
【参考方案2】:在这段代码中
cell.SInfoTxt.text=[Array1 objectAtIndex:indexPath.row];
cell.SInfoTxt.text=[Array2 objectAtIndex:indexPath.row];
如果每个数组的对象总数不同。
您必须在此委托方法 -numberOfRowsInSection 中设置不同的计数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
【讨论】:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section if (section == 0) return [Array1 count ]; else 返回 [Array2 计数]; 我已经设置了这个 cell.SInfoTxt.tag=indexPath.row+1;这是两个部分的通用标签我如何为两个部分创建两个不同的标签... ProfileTableArray 和 profileTblCustomArray 的对象总数相同 Array1,Array2 ? 如果 Array1 有 4 个值但 ProfileTableArray 有 2 个值,当循环到索引 3 但 ProfileTableArray 只有 2 个值时,您使用 [Array1 count] 设置 numberofRowinSection,它现在可能会发生与您的错误相同的错误。 它们在array1和ProfileTableArray中的对象数量相同......对不起【参考方案3】:您有两个数组用于两个部分。所以你可能在数组中有不同的计数。最好你这样使用。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (section == 0 )
return [Array1 count];
else
return [Array2 count];
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
CustomCell *cell=(CustomCell *)[ProfileTable dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomeCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
if (indexPath.section==0)
[cell.SInfoTxt setPlaceholder:[[ProfileTableArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
cell.SInfoTxt.text=[Array1 objectAtIndex:indexPath.row];
cell.SInfoTxt.tag=1000+indexPath.row; // We can easily identifies using tag.
else
[cell.SInfoTxt setPlaceholder:[[profileTblCustomArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
cell.SInfoTxt.text=[Array2 objectAtIndex:indexPath.row];
cell.SInfoTxt.tag=2000+indexPath.row;
return cell;
【讨论】:
是的,我已经写了这是我的代码......并且没有发布我的所有代码......实际上我面临标签问题。 cell.SInfoTxt.tag=indexPath.row+1;这是两个部分的通用标签我如何为两个部分创建两个不同的标签 所有视图都使用默认标记值 0 作为标记值。所以尝试另一个标签值。不要对所有子视图使用相同的标签值。请像这样使用它。 if(section == 0) cell.SInfoTxt.tag = 1000 + indexPath.row;否则 cell.SInfoTxt.tag = 2000 + indexPath.row; ok 并且在 - (void)textFieldDidEndEditing:(UITextField *)textField 我应该只使用 [textField tag] 或其他东西 如果不增加cell.SInfoTxt.tag=2000+indexPath.row中的值。你可以使用 if([textfield tag] >= 2000)int tagvalue= [textfield tag]-2000 else int tagvalue= [textfield tag]-1000以上是关于Objective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]' 用于 UITextField的主要内容,如果未能解决你的问题,请参考以下文章
NSArrayM objectAtIndex:索引 6 超出范围
NSArrayM insertObject:atIndex:]: 对象不能为 nil