调用 popToViewController 的正确方法 - iOS

Posted

技术标签:

【中文标题】调用 popToViewController 的正确方法 - iOS【英文标题】:Proper way to call 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

【问题讨论】:

【参考方案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];
   

【讨论】:

以上是关于调用 popToViewController 的正确方法 - iOS的主要内容,如果未能解决你的问题,请参考以下文章

popToViewController 不工作

applicationDidEnterBackground 触发 popToViewController

popToViewController 生命周期

navigationController popToViewController 不能在 swift 3 中工作

使用 poptoviewcontroller 弹出不同的视图控制器

popToViewController 不工作“试图弹出一个不存在的视图控制器”