2014-01-29 65 views
0

我在更新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没有任何问题。我很担心,因为我如何关闭两个视图控制器,这样做可能会导致问题,但我不确定。

+0

您正在使用自动引用计数?如果没有,问题可能是'updatedWorkouts'是自动发布的,你不会保留它。 – user1118321

+0

是的,我正在使用ARC。 – zic10

回答

1

从你的错误日志,'* - [__ NSArrayI objectAtIndex:]:指数1超出范围[0 .. 0]'这似乎是因为崩溃,您正试图访问空数组中的第一个对象。

更新:

您应该看到断点这两条线段..

1)该行导致崩溃,如果workoutArray是空的。

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

2)该行导​​致崩溃,如果splitArray只有一个对象(也就是,如果:没有检测到,这将有一个对象)。

displayWorkoutName = splitArray[1]; 
+0

@Zeph显示你的代码(cellForRowAtIndexPath :),它与数组访问有关,这将帮助我找到确切的崩溃点。 – Mani

+0

我发现它,我觉得非常愚蠢,但我有两个视图控制器执行此更新并沿导航控制器分支。但是,在视图控制器C上,我忘记了过滤掉DEFAULT:它在应该没有被放在workoutNames中。一旦我解决这个问题,一切都按预期工作。标记你的答案,因为它帮助我确定了碰撞点。非常感谢所有提供意见的人。 – zic10

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]; 
}]; 
+0

我完全试过这段代码,但它仍然导致了同样的错误。 – zic10

+0

将'workoutArray'设置为具有强属性的'@ property'并尝试(@property(nonatomic,strong)NSMutableArray * workoutArray) – Akhilrajtr

+0

我也试过这个,但崩溃仍在发生。以前,我将workoutArray保存为@property(nonatomic,retain)NSMutableArray workoutArray; – zic10