【问题标题】:opening and closing other UIViewControllers - any other approaches than to use protocol & delegate?打开和关闭其他 UIViewController - 除了使用协议和委托之外的任何其他方法?
【发布时间】:2012-07-20 17:23:48
【问题描述】:

从 FirstVC 屏幕中打开另一个屏幕的正常方法是这样的:

    SecondVC *secondVC = [[SecondVC alloc] initWithNibName:@"SecondVC" bundle:nil];
    secondVC.delegate = self; //needed to dismiss
    [self presentModalViewController: secondVC animated: YES];

SecondVC.m 必须导入一个协议,该协议声明调用关闭 SecondVC 的方法

所以我总是要创建一个协议文件SecondVCProtocol.h,它基本上看起来像这样:

@protocol SecondVCProtocol <NSObject>
-(void)secondVCDidFinish;
@end

然后在SecondVC.m我需要导入这个SecondVCProtocol.h文件,现在终于可以调用了

 [self.delegate    secondVCDidFinish]

我刚刚完成了另一个 Android 应用程序,回到 iOS 世界,我觉得这很麻烦。 - 需要在单独的文件中定义这样的协议并需要使用委托 - 只是为了完成最正常的任务,比如关闭屏幕......

难道没有更简单、不那么复杂的方法吗?还是必须这样做?

例如像 SecondVC 中的 [self dismiss] - 没有委托,没有协议 - 他不是很好吗?

非常感谢!

【问题讨论】:

    标签: iphone ios uiviewcontroller delegates


    【解决方案1】:

    你描述的不是最简单的模式。实际上,您应该做一些与您建议的非常相似的事情。当 SecondVC 准备好被解雇时,它只会调用,例如:

    [self dismissViewControllerAnimated:YES completion:NULL];
    

    来自UIViewController documentation

    呈现视图控制器负责关闭它呈现的视图控制器。 如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器。

    【讨论】:

    • 其实他描述的是按照developer.apple.com/library/ios/#featuredarticles/…的“正常”模式
    • 好点。我改变了措辞。我一直使用委托将其他信息实际传达回父视图控制器,而不仅仅是为了解雇。那么协议(如果需要)自然不会那么空洞。
    【解决方案2】:

    你可以打电话

    dismissViewControllerAnimated:completion:
    

    在呈现的视图控制器上,虽然这并不是最佳实践。

    来自 Apple 的文档:

    呈现视图控制器负责关闭视图 它呈现的控制器。如果您在呈现的视图上调用此方法 控制器本身,它会自动将消息转发到 呈现视图控制器。

    也来自 Apple 的文档 (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html)

    当需要关闭呈现的视图控制器时, 首选方法是让呈现视图控制器关闭 它。换句话说,只要有可能,同一个视图控制器 提出的视图控制器也应该负责 解雇它。虽然有几种技术可以通知 呈现视图控制器,其呈现的视图控制器应该 被解雇,首选技术是委托。

    【讨论】:

    • 非常感谢 - 我想我只是坚持“推荐的好方法”
    猜你喜欢
    • 2013-06-25
    • 2012-09-21
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2015-12-08
    • 2016-02-28
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多