Xcode:如何在 UIScrollView 中从 XIB 文件添加自定义视图

Posted

技术标签:

【中文标题】Xcode:如何在 UIScrollView 中从 XIB 文件添加自定义视图【英文标题】:Xcode: How to add Custom View from XIB File in a UIScrollView 【发布时间】:2014-02-03 01:55:52 【问题描述】:

来自 android 和 Java 背景,我是 Xcode 开发的新手。

我正在使用 Xcode 5.0.2 并通过选择 Create a New Xcode Project -> Single View Application 创建了我的第一个 ios 应用程序。初始项目结构已经生成,我发现有一个 Main_iphone.storyboard 文件打开了一个 UI 设计器,我可以在其中拖放项目。我选择了 UIScrollView 并将其拖到已经生成的主窗口中。

现在在 Controller 头文件中,我添加了 @property (nonatomic, retain) IBOutlet UIScrollView *scrollView; 以便我可以从我的控制器代码中访问 scrollView。

我想以编程方式向 scrollView 添加一个项目,所以我通过添加新文件创建了一个模板自定义视图 -> Objective-C Class with XIB for User Interface,将其命名为 TSTFilesInfoController 并通过添加视图和标签来设计 XIB视图内。与上面的 scrollView 相同,我创建了一个属性来在我的控制器类中公开 mainView。

我在 UIScrollView 的控制器和 for 循环中硬编码了一个 10x 循环,我正在实例化 TSTFilesInfoController 并将视图添加到 UIScrollView。但是当我运行应用程序时,UIScrollView 中没有显示或添加任何内容。

添加自定义视图的代码如下:

- (void)viewDidLoad 
        [super viewDidLoad];

        for ( int i = 0; i < 10 ; i++) 
            TSTFilesInfoController *info = [[TSTFilesInfoController alloc] init];

            [self addChildViewController:info];

            [self.scrollView addSubview:info.mainView];
            NSLog(@"View has been added into the scrollView");


        


谁能告诉我我的代码有什么问题以及实现我想要的输出的正确方法是什么?提前感谢您的帮助。

-- 编辑--

此代码在 TSTFilesInfoController.m 中自动生成

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) 
            // Custom initialization
    


    return self;

【问题讨论】:

你是否在XIB文件中连接了mainView?为什么要声明一个mainView而不是ViewController的属性view mainView 连接到 File Owner 中的视图,并且类设置为 TSTFilesInfoController。我将 info.mainView 更改为 info.view 并且有进展。 TSTFilesInfoController 的 viewDidLoad 已被调用。不使用 info.mainView 调用此方法。但 UI 仍然没有显示任何内容。还是一个空白的 UIScrollView 如果我有 xib 文件,我想通过 initWithNibNamed: 初始化我的 viewController。你可以尝试检查你的视图框架是否不是 ZERO 我已经编辑了问题,并包含了 initWithNibNamed 的代码。我在循环中添加了一个日志,用于打印实例化的 TSTFilesInfoController 的尺寸,并打印此 info.view.frame 尺寸 x 0.000000, y 0.000000, w 320.000000, h 130.000000 【参考方案1】:

这是对 UIViewController 子类的误用。不要将视图控制器用作一种钓鱼竿来挂钩 xib 文件中的视图。只需加载 xib 文件并自己获取视图,然后将其填充到您的界面中。

对于如何在界面中手动放置视图控制器的视图有一些复杂的规则,通常这是您不应该做的事情。但是让视图动态和直接地来来去去是很容易和常见的。

假设 .xib 文件名为 TSTFilesInfo.xib,它有一个*** UIView 子类对象,即 MyView 类,这是您想要的。那么:

MyView* v = (MyView*)
    ([[UINib nibWithNibName:@"TSTFilesInfo" bundle:nil]
         instantiateWithOwner:nil options:nil][0]);

这会加载 nib 一次,实例化其内容,并为您提供对该实例的引用(在本例中为 UIView)。现在将v 插入您的界面。将该引用保存在实例变量中(可能很弱,因为它由其父视图保留),以便您随后可以配置 MyView 的任何子视图并与之通信,您已经创建了出口。

注意:但是,我必须从到目前为止的示例中说,在我看来,您真正想要的是 UITableView,而不是简单的 UIScrollView。一切都准备好了,就像您在这里所做的那样。

【讨论】:

您能否通过示例或根据我上面的代码详细说明您的答案?谢谢。 非常感谢 matt,我将修改我的代码,看看能否成功将其添加到我的 UIScrollView。 但是请看我的修订和特别是。最后的注释。

以上是关于Xcode:如何在 UIScrollView 中从 XIB 文件添加自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UIScrollView Xcode 的 ContentOffSet

如何在 Xcode 中从 UIActivityViewController 共享用户位置

如何将 UIScrollView 移动一帧的宽度? (Xcode,斯威夫特)

如何在 Xcode 中从管理器中删除应用程序?

如何在构建设置中从 xcode 7.2 中删除配置文件

如何在 xcode 中从控制器外部更新视图