调用 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的主要内容,如果未能解决你的问题,请参考以下文章
applicationDidEnterBackground 触发 popToViewController
navigationController popToViewController 不能在 swift 3 中工作