在 Interface Builder 中为 Iphone 创建弹出视图控制器

Posted

技术标签:

【中文标题】在 Interface Builder 中为 Iphone 创建弹出视图控制器【英文标题】:Creating popover view controllers for Iphone in Interface Builder 【发布时间】:2013-03-28 14:57:38 【问题描述】:

我该怎么做呢?我知道我必须给 popover 一个视图控制器,它从中构造它的视图,但我不知道如何在 Interface Builder 中构造这个视图(比如添加标签和按钮等等)。

我是否只是在普通情节提要中进行,并且有一个随机不与其他任何东西连接的情节提要,坐在角落里?

我要创建另一个故事板吗?

即使我的项目都是故事板,我是否创建 xib?

我是否以编程方式创建它?

【问题讨论】:

它会从您的应用中的多个地方呈现,还是仅从一个地方呈现? 【参考方案1】:

由于您在问题中没有指定目标设备,所以我给了您 Ipad 答案

IPAD:

转到您的故事板拖放viewcontrollertableviewcontroller 由您决定。然后在情节提要上创建一个从所需的viewcontroller 到新拖放的viewcontroller 的segue。选择你的segue为popOver

确保您在 segue 设置中选择一个锚点,如上图。然后你需要编辑你的 popover 的大小。如果是uiviewcontroller 选择它的视图,如果它是tableviewcontroller 在界面生成器的左侧选择它的tableview 并编辑它的大小。

第一:

第二:

之后自定义您的弹出视图控制器(拖放视图控制器)添加按钮,标记任何您想要的。

如果您要在弹出窗口中执行其他操作: 不要忘记创建新文件 -> uiviewcontroller 或 uitableviewcontroller 的子类。然后将它与故事板上新创建的视图控制器相关联。

IPHONE:

iphone中没有Popover控制器

但您尝试使用第三方https://github.com/50pixels/FPPopover 解决方案,该解决方案通过使用QuartzCore 来模仿iphone 中的弹出框行为

我会尝试以下:

第一:

再次将uiviewcontoller 拖放到情节提要中,然后创建一个新文件-> uiviewcontroller 的子类。

这个新的uiviewcontroller 将位于您故事板的角落

然后将情节提要中的 uiviewcontroller 与 new Created file 相关联,假设您使用 YourViewController 创建了一个新文件名。给你的视图一个故事板ID并选择它的类名。

-(IBAction)buttonClicked:(UIButton*)okButton

    //the view controller you want to present as popover
    YourViewController *controller = [[YourViewController alloc] init]; 

    //if [[YourViewController alloc] init]; doesn't work try this
   // UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                     bundle:nil];
    //YourViewController *controller = [sb instantiateViewControllerWithIdentifier:@"YourViewController"]; 

    //our popover
    FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller]; 

    //the popover will be presented from the okButton view 
    [popover presentPopoverFromView:okButton]; 

    //no release (ARC enable)
    //[controller release];

注意:我之前没有使用过 FPPopover,所以不知道如何安排屏幕大小,但必须在他们的文档中有进一步的解释,只是阅读它。

【讨论】:

太好了,谢谢。但是,如果我使用 FPPopover 库(iPad 弹出框的 iPhone 端口),它只需要弹出框的视图,我可以创建一个普通的 segue 吗?如果您不知道,我完全理解,我误以为两者都是一样的(大多数事情似乎都是)。 @DougSmith 是的,不是 ipad 和 iphone 的一切都是一样的,所以不,你不能在 Iphone Storyboard 中创建一个弹出框。当您尝试在 iphone (push,modal) 中执行 segue 时,segue 将替换当前视图,因此它不起作用。如果您尝试自定义 segue,您可能可以实现它,但我对此表示怀疑。所以你不能用 segue for Iphone 来做,我会试着编辑我的答案并为你提供一个可能的解决方案。 @DougSmith 试试我的 iphone 答案,但不确定它是否会起作用。 @SpaceDust 嗨,我已经完成了弹出视图。问题是我在弹出视图中有一个按钮。当我按下该按钮时,弹出视图应该被关闭。我尝试了一天,但找不到解决方案。你的任何想法都会对我很有帮助。非常感谢。 @Vino 在你的按钮方法中调用[self dismissViewControllerAnimated:YES completion:NULL]; 如果这不起作用发布一个问题,我相信如果你显示你的代码人们会回答它【参考方案2】:

iPhone 解决方案

由于 ios 8.0 也可以为 iPhone 应用程序实现这一点!

目标视图控制器(应该出现在弹出框中的那个)需要符合“UIPopoverPresentationControllerDelegate”协议并且必须实现消息“adaptivePresentationStyleForPresentationController:traitCollection:强>'。除此之外,它的 'modalPresentationStyle' 应该是 'UIModalPresentationPopover' 并且控制器应该是他自己的 'UIPopoverPresentationController' 委托。

以这种方式准备好视图控制器后,只需从您的 UINavigationBarItem(或其他任何东西)到目标视图控制器创建一个故事板 segue(类型:'Present As Popover')。

实施:

@implementation TestViewController

/*
 initWithCoder:

 */
- (instancetype)initWithCoder:(NSCoder *)pDecoder 
    //FLog;

    if (self = [super initWithCoder:pDecoder]) 

        self.modalPresentationStyle = UIModalPresentationPopover;
        self.popoverPresentationController.delegate = self;
    
    return self;



#pragma mark - POPOVER PRESENTATION CONTROLLER DELEGATE

/*
 adaptivePresentationStyleForPresentationController:traitCollection:

 */
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)pController
                                                               traitCollection:(UITraitCollection *)pTraitCollection 
    //FLog;

    return UIModalPresentationNone;


// ...

@end

当然委托协议也可以在其他类中实现,但这种方式是最简单的:-)

【讨论】:

【参考方案3】:

我认为 iPhone 设备的更好方法是创建一个 View Controller,其 View 的背景颜色设置为清除。然后在这个视图中,您只需添加一个较小尺寸的视图,它会呈现一个弹出窗口的外观。

呈现这个视图控制器将给出一个弹出窗口的外观。这是我采取的方法。如果用户点击父视图上超出小视图边界的区域,您可以关闭视图控制器。

【讨论】:

以上是关于在 Interface Builder 中为 Iphone 创建弹出视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在Interface Builder中为Auto Layout Constraints添加标识符?

Interface Builder 中的 AutoLayout 和 UITableViewCell 原型

使用 Interface Builder 构建的自定义 UIView 可通过 Interface Builder 访问/定位

Builder模式 和 Fluent Interface

在 Interface Builder 中连接元素

在我看来,iOS 项目未显示从 Interface Builder 构建的 Interface 元素