【问题标题】:Proper way to call popToViewController - iOS调用 popToViewController 的正确方法 - iOS
【发布时间】:2015-09-13 04:14:15
【问题描述】:

我正在与我的团队成员就 popToViewController 发生争执。

对我来说最好的方法是 Can i pop to Specific ViewController?

但他认为我们应该创建viewController的静态实例,然后调用

-(void)takeToPreviousViewController {
    if([IVPreviousViewController sharedInstance]) {
        [self.navigationController popToViewController:[IVPreviousViewController sharedInstance] animated:YES];
    }
}

我强烈推荐这种方法,因为我们在 IVPreviousViewController 中创建了一个与 currentViewController 无关的公共方法。我们应该始终避免这样暴露方法。

谁能给我一个关于最佳方法的充分理由。

更新:

IVVreviousViewController.h

__weak static IVPreviousViewController * staticEventDetailViewController;

    +(IVPreviousViewController *)sharedInstance;

IVPreviousViewController.m

+(IVPreviousViewController *)sharedInstance {
    return staticEventDetailViewController;
}

这种方法的原因 - 在我们的 viewController 中的特定用例中,它必须弹回 IVPreviousViewController

【问题讨论】:

    标签: ios objective-c uinavigationcontroller poptoviewcontroller


    【解决方案1】:

    这是我的看法:

    我支持你的意见。我们应该尽可能避免使用静态共享实例。静态实例保留在内存中,直到应用程序生命周期。从此实例中引用的所有其他对象也将保留在内存中。

    使用上面提到的方法,不再需要的共享链接 VC 将被占用内存。另外,如果你没有很多 VC,最好从源 VC 中对目标 VC 进行弱引用,而不是循环选择目标 VC。

    是的,在目标 C 的上下文中,为了更好的可读性,头文件应该只包含外部世界真正需要的那些 API。

    【讨论】:

    • 嘿@Abhinav 我在我的问题中添加了更多更新。如果您有更多见解,请告诉我。 VC 永远不会留在内存中,因为他创建了 __weak static。但我仍然认为这不是最好的方法
    • 正如我所说,始终避免单例,尤其是在这种情况下,我们的损失大于收益。该功能可以通过保持对IVPreviousViewController 的弱引用来实现。无需将IVPreviousViewController 始终保留在内存中。在仪器上运行应用程序,这将使其更加清晰。
    • 嘿@Abhinav,很抱歉把你带入我们的争吵中:) 我们使用静态弱指针来引用IVPreviousViewController。那么关于为什么不使用弱指针的任何建议/想法呢?
    • 对我来说,代码没有传达正确的意图;基本上我觉得它模棱两可。这里sharedInstance 传达了在多个对象之间共享的单例对象的想法。然而,在这种情况下,它似乎是一个具有弱引用属性的对象,即IVPreviousViewController 的每个实例化,sharedInstance 的值会有所不同,这在设计上是不正确的。
    • 在您的代码中,您可能确定实例化将在一个特定流程中发生,但明天如果您离开项目,新人要理解添加sharedInstance 的原因会有点棘手这实际上不是共享实例。希望这是有道理的!
    【解决方案2】:

    我认为你可以这样做

    -(void)popToVC:(ClassNameOfTheViewController)controllerClass{
     for(UIViewController *vc in self.navigationController.viewControllers)
        if( [vc isKindOfClass:[controllerClass class]]){
         [self.navigationController popToViewController:vc animated:YES];
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2012-09-15
      • 2017-02-26
      • 2011-04-15
      • 2018-06-10
      • 1970-01-01
      相关资源
      最近更新 更多