更新表视图会导致崩溃

时间:2014-01-29 06:24:59

标签: ios iphone objective-c uitableview

我在更新ios中的表视图时遇到了一些代码问题。让我先解释一下我的观点结构。

视图A是嵌入在导航控制器中的表格视图。视图B和视图C都是模态视图控制器。层次结构就是这个。

A - > B - > C.当在C点击“保存”时,需要关闭C和B返回A,重新加载表A中的数据,然后推送到导航控制器D.随着表的更新,每当用户滑回A时,模态视图中的更改将显示出来。

让我在保存之前从模态视图C开始。

 self.workoutsVC.workoutName = workoutNameToSave;

NSArray *updatedWorkoutsArray = [databaseController getAllWorkouts];

NSMutableArray *updatedWorkouts =
[NSMutableArray arrayWithArray:updatedWorkoutsArray];

[self.workoutsVC receiveWorkoutNameAndDismissModalViews:workoutNameToSave
                                        updatedWorkouts:updatedWorkouts];

我保留了对C中View Controller A的引用,这是我之前在Segue中设置的。现在让我展示一下回到View Controller 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次锻炼,这是用户保存锻炼后的最新值。基本上我只是在workoutArray中添加了一个新行。

这是崩溃:

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [__ NSArrayI objectAtIndex:]:索引1超出边界[0 .. 0]'

我尝试过不同的组合。注释掉reloadData方法将避免崩溃,并且视图B和C将被忽略并且D将被推入堆栈但是A中的数据将不会被更新。如果我注释掉dismissViewControllers,那么reloadData方法将正常运行,但B和C将不会被解除。我也尝试在viewDidAppear或viewWillAppear上执行reloadData,但这也导致了与上面提到的相同的崩溃。我很确定问题出在我的代码结构中,但我不知道如何安排这个序列并避免这个问题。如果有人能帮助我,我真的很感激。

**也不确定这是否有问题,但我会发布如何从B和C引用View Controller A.

B和C都包含View Controller A的属性:

@property (nonatomic, retain)Workouts *workoutsViewController;

因此,当View A转到View B A - > B,B得到A的引用

    newWorkoutViewController = [segue destinationViewController];

    newWorkoutViewController.workoutsViewController = self;

然后,当视图B转到C B - > C C获取B对A的引用:

     randomWorkoutTypeSettingsViewController =
                                        [segue destinationViewController];

     randomWorkoutTypeSettingsViewController.exercises = exercises;
     randomWorkoutTypeSettingsViewController.workoutsVC =
                                            self.workoutsViewController;

然后最后,一旦用户点击保存并关闭C并进行数据库更新,那么我之前发布的初始代码将在启动过程中点击:

self.workoutsVC.workoutName = workoutNameToSave;

NSArray *updatedWorkoutsArray = [databaseController getAllWorkouts];

NSMutableArray *updatedWorkouts =
[NSMutableArray arrayWithArray:updatedWorkoutsArray];

[self.workoutsVC receiveWorkoutNameAndDismissModalViews:workoutNameToSave
                                        updatedWorkouts:updatedWorkouts];

但是,我已经采用了类似的方法来关闭一个模态View Controller,然后重新加载数据并推送一个新的VC而没有任何问题。我担心的是因为我关闭了两个View Controller并且这样做可能会导致问题,但我不确定。

2 个答案:

答案 0 :(得分:1)

从您的错误日志'* - [__ NSArrayI objectAtIndex:]:索引1超出边界[0 .. 0]'这似乎是因为崩溃,您正在尝试访问空数组中的第一个对象

<强>更新

你应该看到这两行有断点..

1)如果workoutArray为空,此行会导致崩溃。

 Workout *tempPlaceholder = [workoutArray objectAtIndex:indexPath.row];

2)如果splitArray只有一个对象(如果:未检测到,则会有一个对象),此行会导致崩溃。

displayWorkoutName = splitArray[1];

答案 1 :(得分:0)

receiveWorkoutNameAndDismissModalViews:

中试试
[workoutArray setArray:updatedWorkouts];
[self dismissViewControllerAnimated:YES completion:^{

    [_workoutTableView reloadData];
    exercisesPerWorkoutViewController =
    [self.storyboard
     instantiateViewControllerWithIdentifier:@"ExercisesPerWorkout"];

    exercisesPerWorkoutViewController.workoutName = workoutNameParam;

    [self.navigationController
     pushViewController:exercisesPerWorkoutViewController
     animated:YES];
}];