我在更新ios中的表视图时遇到了一些代码问题。首先让我解释我的视图结构。更新表视图导致崩溃
查看A是嵌入在导航控制器中的表格视图。视图B和视图C都是模态视图控制器。等级是这样的。当在C处点击“保存”时,这需要关闭C和B返回到A,重新加载表A中的数据,然后推到导航控制器D.随着表更新,每当用户滑回到A时,模态视图的变化都会显示出来。
让我从保存前的Modal View C开始。
self.workoutsVC.workoutName = workoutNameToSave;
NSArray *updatedWorkoutsArray = [databaseController getAllWorkouts];
NSMutableArray *updatedWorkouts =
[NSMutableArray arrayWithArray:updatedWorkoutsArray];
[self.workoutsVC receiveWorkoutNameAndDismissModalViews:workoutNameToSave
updatedWorkouts:updatedWorkouts];
我保持对我在之前在Segue中设置的C中的View Controller A的引用。现在让我告诉下一个方法,它是早在视图控制器A.
-(void) receiveWorkoutNameAndDismissModalViews:(NSString *)workoutNameParam
updatedWorkouts:(NSMutableArray *)updatedWorkouts
{
workoutArray = updatedWorkouts;
[_workoutTableView reloadData];
//Will dismiss modal views B and C before firing the push.This could be the problem
//but I'm not entirely positive if it is.
[self dismissViewControllerAnimated:YES completion:nil];
exercisesPerWorkoutViewController =
[self.storyboard
instantiateViewControllerWithIdentifier:@"ExercisesPerWorkout"];
exercisesPerWorkoutViewController.workoutName = workoutNameParam;
[self.navigationController
pushViewController:exercisesPerWorkoutViewController
animated:YES];
}
此时程序会崩溃。 updatedWorkouts将有1次锻炼,这是用户保存锻炼后的最新值。本质上,我只是添加1行到workoutArray。
这里是崩溃:
*终止应用程序由于未捕获的异常 'NSRangeException',原因: '* - [__ NSArrayI objectAtIndex:]:索引1超出范围[0 .. 0]'
我试过不同的东西组合。注释掉reloadData方法可以避免崩溃,视图B和C将关闭,并且D将被压入堆栈,但A中的数据不会被更新。如果我注释掉dismissViewControllers,那么reloadData方法将正常工作,但B和C不会被解除。我也试着在viewDidAppear或viewWillAppear上做reloadData,但是这也导致了上面提到的同样的崩溃。我很确定问题出在我的代码结构中,但我不知道如何安排这个序列并避免这个问题。如果有人能够帮助我,我真的很感激它。
**也不知道这是否可能是一个问题,但我会发布我如何引用视图控制器A从B和C.
B和C都含有属性以查看控制器A为这样:
@property (nonatomic, retain)Workouts *workoutsViewController;
因此,当观去查看BA - > B,B到达一个基准作为这样
newWorkoutViewController = [segue destinationViewController];
newWorkoutViewController.workoutsViewController = self;
然后当视图B去CB - > CC获取B的参照这样:
randomWorkoutTypeSettingsViewController =
[segue destinationViewController];
randomWorkoutTypeSettingsViewController.exercises = exercises;
randomWorkoutTypeSettingsViewController.workoutsVC =
self.workoutsViewController;
于是最后,一旦用户点击小号AVE和C关闭和数据库更新由然后我先前公布的最初代码被击中起动过程:
self.workoutsVC.workoutName = workoutNameToSave;
NSArray *updatedWorkoutsArray = [databaseController getAllWorkouts];
NSMutableArray *updatedWorkouts =
[NSMutableArray arrayWithArray:updatedWorkoutsArray];
[self.workoutsVC receiveWorkoutNameAndDismissModalViews:workoutNameToSave
updatedWorkouts:updatedWorkouts];
不过,我已经做了收出一个模式视图控制器,然后重新加载数据和类似的方法推动一个新的VC没有任何问题。我很担心,因为我如何关闭两个视图控制器,这样做可能会导致问题,但我不确定。
您正在使用自动引用计数?如果没有,问题可能是'updatedWorkouts'是自动发布的,你不会保留它。 – user1118321
是的,我正在使用ARC。 – zic10