【问题标题】:source view controller vs. presenting view controller源视图控制器与呈现视图控制器
【发布时间】:2015-07-16 22:06:53
【问题描述】:

我正在阅读一本书,其中指出源视图控制器不一定是呈现视图控制器。源 VC 是调用 presentViewController:... 方法的那个,而呈现的 VC(它的视图)是被呈现的 VC 视图遮蔽的那个。我想不出一个例子,其中呈现的 VC 与源 VC 不同。请提供一些。谢谢

书中的文字:

原主播: presentViewController:animated:completion: 被发送到的视图控制器。 Apple 有时将此视图控制器称为源; “原始主持人”是我自己的术语。 呈现的视图控制器被设置为原始呈现者的presenterViewController。

呈现视图控制器: 呈现的视图控制器的presentingViewController。这是视图控制器,其视图被呈现的视图控制器的视图替换或覆盖。默认情况下,它的视图是整个界面的视图控制器——即根视图控制器或已经存在的呈现视图控制器。它可能与原始演示者不同。 呈现的视图控制器被设置为呈现视图控制器的presentedViewController。因此,呈现的视图控制器可能是两个不同视图控制器的呈现视图控制器。”

【问题讨论】:

    标签: ios uiviewcontroller modalviewcontroller


    【解决方案1】:

    在学习视图控制器转换时,我也问过自己同样的问题,特别是在尝试理解 UIViewControllerTransitioningDelegate 协议中的 animationControllerForPresentedController:presentingController:sourceController: 方法时。争论在于presentingControllersourceController 参数之间的区别。

    我在View Controller Programming Guide 中找到了答案。您可以在模态显示视图控制器部分找到以下内容:

    调用 presentViewController:animated:completion: 方法可能不是唯一的 实际执行模态表示。演讲风格 确定视图控制器的呈现方式,包括 呈现视图控制器所需的特性。为了 例如,全屏演示必须由全屏 视图控制器。如果当前呈现的视图控制器不是 合适,UIKit 遍历视图控制器层次结构,直到找到一个 那是。完成模态演示后,UIKit 会更新 presentingViewController 和presentingViewController 的属性 受影响的视图控制器。

    这意味着'源'视图控制器的概念不是你提到的书的作者随机创建的。

    【讨论】:

    • 哦,我明白了。如果呈现 VC 能够呈现视图控制器,则呈现 VC 和源 VC 是相同的。很高兴清除它
    • 反之:如果源VC能够呈现另一个控制器,它将成为呈现视图控制器。
    【解决方案2】:

    恐怕您正在阅读的这本书可能会使一个复杂的主题变得更加复杂,因为它在整个名称组合中添加了所谓的 Source View Controller。

    对于初学者来说,视图控制器中没有“源”这样的概念。在谈论Container View Controllers 时,您只有parentViewControllerchildViewControllers 。在谈论presenting View Controllers modally 时,您有一个presentingViewController 和一个presentedViewController only

    您还有视图控制器,其主要目的是管理其他视图控制器,即导航控制器、标签栏控制器、拆分视图控制器和弹出框演示控制器。因此,任何给定的视图控制器都可以查询自己以了解它是否“附加”到例如导航控制器。

    我猜你的书暗示的是源 VC 将是使另一个 VC 出现在屏幕上的那个。从这个意义上说,是对的。 “来源”可能与呈现的 VC 不同。拿这个sn-p:

    [self presentViewController:aViewController animated:YES completion:nil];

    在上面的例子中,呈现的 VC 也是“源”VC。但在这里:

    [someViewController presentViewController:anotherViewController animated:YES completion:nil];

    我们在某处的某个 VC 上调用该方法,并传递另一个 VC 作为参数。所以在这种情况下,呈现的 VCsomeViewController呈现的 VCanotherViewController。如果这行代码在第三个 VC 中,那么所说的第三个 VC 将是“源”。

    但就是这样!这最后一段代码可能根本就不在 View Controller 中,所以想到“源 VC”有点奇怪。 p>

    【讨论】:

    • 首先,感谢您的回答。我明白你的意思,但我不确定这就是作者的想法。我用书中的文本 sn-p 编辑了我的问题,这样我们就可以在同一页上。
    • @krompir2 UIStoryboardSegue有一个属性叫sourceViewController,是不是作者说的这个?
    • 不,这是关于呈现/呈现的视图控制器。也许我们应该问马特,因为他是作者:D
    • 好点,@rdelmar。忘记 Segues...我想编辑答案以反映这一点,但这可能会使事情变得更加复杂。
    • @krompir2,感谢 sn-p 和男孩,它是不是很神秘。我仍然不明白作者所说的“根视图控制器或已经存在的视图控制器”是什么意思。因为这意味着呈现的 VC 可以进一步呈现另一个 VC,这是不可能的(至少在 iOS 上不是)。你不能让一个 VC 以模态形式呈现,然后在其上再放置另一个模态 VC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多