【问题标题】:reusing the same UITableViewController重用相同的 UITableViewController
【发布时间】:2015-04-26 00:55:05
【问题描述】:

我有一个 tableviewcontroller 需要向下钻取并显示 3 层数据。我向下钻取没有问题,但是当我返回时,单元格和表格变为空。我目前正在使用情节提要,并且在使用 nib 时没有遇到此问题。我所要做的就是 alloc 和 initWithNibName 同一个视图,它会创建同一个 TableView 的另一个实例,我可以返回所有数据。

我尝试过使用 segue,但它不起作用,因为如果我向下钻取,我需要 tableviewcontroller 将其重新连接回自身。我创建了自己的方法来推送视图控制器并将数据传递到自身的新实例中

- (void)drillDown{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    ExerciseTableViewController *tableView = [storyboard instantiateViewControllerWithIdentifier:@"ExerciseTableView"];
    tableView.title = _detailTitle;
    tableView.delegate = self;
    tableView.level = _level;
    tableView.currentSMID = _currentSMID;
    tableView.currentMID = _currentMID;
    tableView.muscleNameArray = _muscleNameArray;
    if (_level == 2) {
        tableView.submuscleNameArray = _submuscleNameArray;
    }
    [self.navigationController pushViewController:tableView animated:YES];
}

这就是我的 viewDidLoad 中的内容

- (void)viewDidLoad {

[super viewDidLoad];



UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addExercise:)];
self.navigationItem.rightBarButtonItem = add;

NSLog(@"level: %i, currentSMID: %i, currentMID: %i", _level, _currentSMID, _currentMID);

if (self.managedObjectContext_ == nil) {
    self.managedObjectContext_ = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

if (_level == 1) {
    _submuscleNameArray = [self submuscleGroup:_currentMID valueForKeyPath:@"submuscleGroup"];
    _submuscleIDArray = [self submuscleGroup:_currentMID valueForKeyPath:@"submuscleID"];
} else if (_level == 2) {
    //loading and sorting exercise list
    _exerciseList = [self loadExercise:_currentMID sub:_currentSMID];
    _exerciseListSorted = [self sortKeysByName];
} else {
    [self loadMuscleGroup];
}

}

仅当我将其中一些代码放入 viewDidAppear 时才会填充表格视图,但我无法区分向下钻取和返回 viewDidAppear。

navigationController 不应该保存我当前的视图并推送一个新视图,当我弹出新视图时,我会回到我当前的视图?

似乎每次我弹出视图时,前一个视图都需要重新加载,这导致我以前的视图变为空白。

有什么建议吗?

附上故事板

【问题讨论】:

  • 应该是这样,所以我建议实际上你并没有弹出 - 你可能不小心创建了这个视图控制器的全新实例。 - 还要记住 viewDidLoad 在视图控制器的生命周期中只被调用一次,所以如果你在弹出时看到它被调用,你就没有弹出。另一方面,viewDidAppear 在创建时调用。
  • "但我无法区分向下钻取和返回 viewDidAppear" 实际上这不是真的。如果这是你需要做的才能让它工作,你需要问一下。
  • 你能告诉我我是否用上面的drillDown方法实例化了一个新视图吗?我从来没有遇到过使用 nib 文件的问题,但故事板让我发疯。
  • 让我们专注于您的问题的这一行:“但它不起作用,因为如果我向下钻取,我需要 tableviewcontroller 自行恢复”您所做的是,您有 两个 故事板中同一类的实例。你有一个从第一个到第二个的 push segue,然后返回(pop),如果你不想只使用内置的 Back 按钮,你可以使用 unwind segue。我担心故事板现在是如何与您的代码相关的...
  • 我添加了我的故事板的图片。 navigationviewcontroller 不会自动处理弹出问题吗? popping 和 unwind segue 有什么区别?我试过有 3 个表视图实例(3 层向下钻取),并让它们都使用 segue 引用同一个类,但效果不佳。 viewDidLoad 只调用一次,但我怀疑我可能正在创建视图控制器的新实例,或者当它弹出时,它会删除我的所有数据并导致以前的视图变为空白。

标签: ios objective-c uitableview popviewcontroller


【解决方案1】:

所以我想出了问题所在。我有一个名为 _level 的变量,我用它来跟踪我所处的向下钻取级别。当将此变量传递到下一个级别时,我已将当前级别替换为下一个级别编号,因此当我回到以前的看法。当前关卡和下一个关卡一样。

我通过创建一个名为 nextLevel 的新变量并将其传递下来解决了这个问题。

我犯了非常基本的错误。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多