我在更新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