容器视图中的presentViewController

Posted

技术标签:

【中文标题】容器视图中的presentViewController【英文标题】:presentViewController in containerview 【发布时间】:2013-10-31 21:29:03 【问题描述】:

首先,这个问题与this question 不重复,因为该解决方案不适合我的问题。

我想在container 中显示presentViewControllerMCBrowserViewController。因为我不希望呈现的控制器覆盖整个屏幕。

我的 ViewController 里面有容器,看起来像这样:

我必须使用presentViewController,因为我的MCBrowserViewController需要这个方法来触发重要部分。

我的问题是,我不知道如何呈现它,因为容器显然是一个视图,我不知道该怎么做。

如何使用 present-method 显示容器内的视图控制器?

【问题讨论】:

理论上,你可以使用一些 ios 7 技术来执行presentViewController,而呈现的视图控制器不会占据整个屏幕(参见Custom View Controller Transitions),但在我们之前去那个兔子洞,也许你可以描述一下那个视图控制器正在做什么需要presentViewController MCBrowserViewController 开始搜索由 presentViewController 呈现的其他设备。浏览控制器是一个框架控制器。 你能解释一下为什么需要展示它,而不是仅仅作为一个子视图控制器添加到容器中吗?演示会导致什么事情被触发? 我原以为如果你执行典型的收容过程(addChildViewControlleraddSubviewdidMoveToParentViewController 等),它会工作得很好。需要presentViewController 的唯一原因是它 (a) 设计不当,需要全屏显示;或 (b) 它正在使用 dismissViewController 解雇自己。但我不知道那个控制器,所以我不能对此发表评论。但是我上面引用的那个视频显示了如何呈现不占据整个屏幕的视图控制器,但在大多数情况下我不建议这样做。 【参考方案1】:

我尝试添加一个 MCBrowserViewController 作为子视图控制器,效果很好。它一添加就开始搜索。在这个例子中,IBOutlet contView,是一个普通的UIView(不是容器视图),其目的只是设置IB中MCBrowserViewController的frame。

    -(IBAction)showController:(id)sender 
        MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:@"MyPeer"];
        MCSession *session = [[MCSession alloc] initWithPeer:peerID];
        MCNearbyServiceBrowser *browser = [[MCNearbyServiceBrowser alloc] initWithPeer:peerID serviceType:@"Service1"];
        MCBrowserViewController *mcb = [[MCBrowserViewController alloc] initWithBrowser:browser session:session];
        [self addChildViewController:mcb];
        [mcb didMoveToParentViewController:self];
        mcb.view.frame = self.contView.bounds;
        [self.contView addSubview:mcb.view];
    

【讨论】:

【参考方案2】:

呈现的视图控制器的框架由呈现上下文确定,通常由根视图控制器提供(即全屏)。但是,表示层次结构中的任何表示控制器都可以通过将其definesPresentationContext 属性设置为返回 true 来提供上下文。然后它的框架将用于确定呈现视图的框架。 (请参阅 Apple 的 View Controller Programming Guide 中的 Presentation Contexts 提供 Presented View Controller 所覆盖的区域)

【讨论】:

以上是关于容器视图中的presentViewController的主要内容,如果未能解决你的问题,请参考以下文章

splitView 中的 didReceiveRemoteNotification presentViewController

iOS 7:自定义容器视图控制器和内容插入

presentViewController over TabBarController 导致“尝试在其视图不在窗口层次结构中的 TabBarVC 上呈现 *VC”

如何在封面视图和主页中使用“presentViewController”

iOS:不同情节提要中的 presentViewController 未显示导航栏

presentViewController 警告视图不在窗口层次结构中