2014-01-29 98 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