以编程方式将视图加载到 UIViewController

Posted

技术标签:

【中文标题】以编程方式将视图加载到 UIViewController【英文标题】:Loading a View programatically in to a UIViewController 【发布时间】:2013-04-08 18:26:21 【问题描述】:

我实际上有 2 个问题。首先,我将解释这个场景。我有一个简单的 Storyboard 应用程序。第一个控制器是显示邮件类型列表的UITableViewController。当点击一个单元格时,它会转到UIViewController,并且根据所选的邮件类型,它会将UIView 加载到UIViewController 中。这一切都很好。我的问题是,

我有一个UIView,身高559。我在UIViewController 中放了一个UIScrollView,这样当加载了额外高度的UIView 时,它就可以滚动了。但是,UIView 并没有发生这种情况,而是调整为UIViewController 的大小。如何保持其原始高度并将其嵌入到UIScrollView 中? 在界面生成器中,我在UIViewController 的底部放置了一个UIToolbar。但是当UIView 被加载到其中时,UIToolbar 就会消失。我猜UIView 出现在UIToolbar(?) 的顶部。我怎样才能避免这种情况发生?

我知道这一定有点让人难以理解。因此,我上传了一个 Xcode 项目,演示了 here 的 2 个问题。

请看一下,告诉我应该怎么做。

谢谢。

【问题讨论】:

请详细说明哪种“邮件类型”有哪些问题。我看到“项目备忘录”显示了一个底部看起来像工具栏的视图。哪种“邮件类型”会导致高度和滚动问题? 它是 Email 邮件类型。对此感到抱歉。 【参考方案1】:

我发现您在项目中所做的事情存在一些问题,这可以解释为什么您会得到这些结果。

    NewMailViewController.m 中,您将在情节提要中创建的视图(具有滚动视图和工具栏的视图)替换为您从笔尖加载的视图(即self.view = [nib objectAtIndex:0];)。尝试在 -loadView 中执行此操作

    [super loadView];
    
    UIView *someView = nil;
    
    if ([self.mailTypeName isEqualToString:@"Email"]) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil];
        someView = [nib objectAtIndex:0];
    
    else if ([self.mailTypeName isEqualToString:@"Facsimile"]) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil];
        someView = [nib objectAtIndex:0];
    
    else if ([self.mailTypeName isEqualToString:@"Memorandum"]) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil];
        someView = [nib objectAtIndex:0];
    
    else if ([self.mailTypeName isEqualToString:@"ProjectMemo"]) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil];
        someView = [nib objectAtIndex:0];
    
    
    CGRect frame = someView.frame;
    frame.size.width = self.myScrollView.frame.size.width;
    [someView setFrame: frame];
    
    [self.myScrollView addSubview: someView];
    [self.myScrollView setContentSize: someView.bounds.size];
    

    您会注意到我在上面的 sn-p 代码中引用了滚动视图。您需要在 NewMailViewController 类中为滚动视图创建一个出口,以便您可以根据需要引用它。它涉及将其放入您的头文件中:

    @property (strong, nonatomic) IBOutlet UIScrollView *myScrollView;

    您需要将定义的插座连接到实际故事板的滚动视图。您可以在 Internet 上搜索“在 Xcode 中创建或连接 outlets”以获取更多信息。

    工具栏似乎是滚动视图的子视图。当滚动视图的内容滚动时,您不希望工具栏停留在视图的底部吗?如果是这样,您需要将该工具栏视图从滚动视图中移出。

以下是更改:http://www62.zippyshare.com/v/90505016/file.html

【讨论】:

以上是关于以编程方式将视图加载到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

UIViewControl之间的七种传值方式

在 Swift 中以编程方式将视图添加到 stackview

以编程方式将一堆自定义视图从 XIB 添加到 UIStackView

使用 Swift 以编程方式插入按钮并加载第二个视图

Swift - StackView 和添加约束,以编程方式添加视图到堆栈 - 加载后调整单元格高度?