gpt4 book ai didi

ios - 更新 TableView 导致崩溃

转载 作者:行者123 更新时间:2023-11-29 03:18:16 26 4
gpt4 key购买 nike

我在 ios 中更新 TableView 时遇到一些代码问题。让我先解释一下我的 View 结构。

View A 是嵌入在导航 Controller 中的 TableView 。 View B 和 View C 都是模态视图 Controller 。层次结构是这样的。

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

让我在保存之前从模态视图 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 的引用。现在让我展示 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 添加 1 个新行。

这是崩溃:

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayI objectAtIndex:]:索引 1 超出范围 [0 .. 0]”

我尝试过不同的组合。注释掉 reloadData 方法将避免崩溃, View 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;

然后当 View 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];

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

最佳答案

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

更新:

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

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

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

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

displayWorkoutName = splitArray[1];

关于ios - 更新 TableView 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21423632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com