我创建了一个带有一些箭头键的键盘,允许用户使用箭头按钮在tableview中的所有文本字段之间导航。 (每个细胞2个)
在某些情况下,单元格将被禁用,因此我有一个递归调用来跳过它们。即。如果用户按下右箭头,并且textField被禁用,则递归再次调用右箭头以跳过它。
我还为自己需要完成的任何滚动设置动画。但是,最近发生了一些事情,当用户导航到新的textField并且滚动动画完成后,尝试设置firstResponder时会导致EXEC_BAD_ACCESS。
我可以从第一个单元格开始重复此问题并向下导航2次。这是代码,按照我可以显示的最佳状态进行排序,编辑很多(就像其他3个箭头按钮的所有代码一样,所以你只看到所谓的行)
//receive the arrow button pressed first
_arrowButton = arrowButton;
@try
{
switch (_arrowButton.tag)
{
case NumericKeyboardViewDownArrow:
destinationIndexPath = [NSIndexPath indexPathForRow:currentIndexPath.row + 1 inSection:currentIndexPath.section];
newTag = currentTextField.tag;
break;
default:
break;
}
// check bounds of the intended index path and return if out of bounds
if ((destinationIndexPath.row == -1) || (destinationIndexPath.row >= [_tableView numberOfRowsInSection:[destinationIndexPath section]])) {
destinationIndexPath = currentIndexPath;
return;
}
/*
Animation for scrolling
*/
CGPoint current = [_tableView contentOffset];
// if we must animate up
if (destinationIndexPath.row < currentIndexPath.row)
{
// up code here
}
// if we must animate down
else if (destinationIndexPath.row > currentIndexPath.row)
{
// always scroll animate for down
[_tableView setContentOffset:CGPointMake(0, current.y + _tableView.rowHeight) animated:YES];
}
// if we only move left or right
else
{
// left and right code here
}
//update our current location
currentIndexPath = destinationIndexPath;
@catch (NSException *e)
{
return;
}
然后在动画完成后完成动画制作方法
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
//after the animation is done, set the responder
nextTextFieldSelection = (UITextField *)[[_tableView cellForRowAtIndexPath:currentIndexPath] viewWithTag:newTag];
NSLog(@"nexttextfield%@",nextTextFieldSelection);
if (nextTextFieldSelection)
{
//CRASH OCCURS HERE [nextTextFieldSelection becomeFirstResponder];
}
[self checkTextFieldIsDisabled];
}
在该方法结束时,我在一个新的文本字段中,我们检查是否已禁用。在重现这次崩溃时,它只是退出,因为我移动的textFields没有被禁用。
我已经尝试在调用新的becomeFirstResponder之前重新启动第一个响应者,但这似乎没有任何效果。我可能不会在正确的位置辞职。内存问题会出现什么想法?
由于