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

时间:2014-02-03 01:55:53

标签: objective-c xcode uiscrollview custom-view

来自Android和Java背景,我对Xcode Development相对较新。

我正在使用Xcode 5.0.2并通过选择Create a New Xcode Project创建我的第一个IOS应用程序 - >单视图应用程序。最初的项目结构已生成,我发现有一个Main_iphone.storyboard文件,它打开一个UI Designer,我可以在其中拖放项目。我选择了UIScrollView并将其拖动到已生成的主窗口中。

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

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

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

下面是添加CustomView的代码:

- (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;
}

1 个答案:

答案 0 :(得分:3)

这是对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。它完全可以做到你在这里看到的那种东西。