0

在任何 iPhone 应用程序中,请考虑以下顺序 (VC=ViewController):

  1. 显示 VC-A ... 用户点击按钮加载 VC-B
  2. VC-B 现在被推送并显示...用户将滑块从 0 移动到 5...然后点击导航栏上的返回
  3. VC-B 被弹出,VC-A 被显示...用户再次点击按钮加载 VC-B
  4. VC-B被推并显示...但滑块回到0

发生这种情况是因为上面第 2 步中的 VC-B 实例与第 4 步中的 VC-B 实例不同,因此状态丢失。为了避免这种情况,我可以使 VC-B 成为单例,或者在某处保留对 VC-B 的强引用并重用它而不是创建新实例。

当我从 nib 加载我的 VC 时,这个逻辑曾经运行良好,因为我会在代码中手动创建 VC 的实例。对于故事板,这不起作用,因为它是自动创建实例的 segue。那么我怎样才能确保我重复使用我的 VC 呢?

我尝试了以下技巧来维护单例:


- (id) initWithCoder:(NSCoder *)aDecoder{
    if(instance==nil){
        NSLog(@"LMHomeViewController init called");
        instance = [super initWithCoder:aDecoder];
        super.screenType = [NSNumber numberWithInt:home_screen];
    }
    return instance;
}

但我遇到了运行时错误:

Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder:'

这里有什么建议吗?我的兴趣是在用户在导航树中来回移动时保持 VC 的状态。

注意:在我的例子中,状态是一个 UIWebView,因此它不可能保持它的状态。

4

1 回答 1

0

这可能是使用的情况NSUserDefaults- 在 on 中读取状态,在 上viewWillAppear写出状态viewWillDisappear,(以及其他任何适当的地方)

在任何情况下,MVC 最好保留在您的模型中,而不是保留在视图层次结构中。所以如果不是 NSUserDefaults,考虑一个只需要存储状态数据的单例。

另一个想法。如果您确实想保留 viewController 对象 - 不要使用故事板转场。在属性中保持强引用并使用

  [self.navigationController pushViewController:self.persistingViewController];

访问器可以第persistingViewController一次延迟实例化 viewController。只要保留引用,就可以重用:

  - (UIViewController*) persistingViewController
  {
     if (!_persistingViewController) {
       UIStoryboard *story = [UIStoryboard storyboardWithName:@"MainStoryBoard" bundle:nil];
     _persistingViewController = [story instantiateViewControllerWithIdentifier:@"myViewController"];

   }

   return self.persistingViewController

}

于 2013-02-04T17:59:33.233 回答