来自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;
}
答案 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。它完全可以做到你在这里看到的那种东西。