每个viewController可以有多个视图吗?

时间:2011-04-27 11:58:19

标签: iphone objective-c accelerometer

这是我发现的一个相关问题,但它没有详细回答我的问题。

[http://stackoverflow.com/questions/3209993/cocoa-touch-can-i-have-multiple-views-per-view-controller-or-specify-bounds-of] [1]

我有一个UIView类BallView,它被设置为ballViewController的默认视图。现在,根据加速度计,这个视图有一个球在弹跳。每次加速度计发送更新时,我都会调用私有函数draw

然而,我的主要问题是:我希望有多个这样的球弹跳。

我是否必须为每个班级重新创建视图?但是,文件所有者的IBOutlet view也必须连接。 IBOutlet只能指向一个地址。

还有其他方法吗?

以下是我在ballViewController中实例化Ball View类的方法:

[motionManager startAccelerometerUpdatesToQueue:queue withHandler:
 ^(CMAccelerometerData *accelerometerData, NSError *error){
     [(BallView *)self.view setAcceleration:accelerometerData.acceleration];
     [(BallView *)self.view performSelectorOnMainThread:@selector(draw) withObject:nil waitUntilDone:NO];
 }];

因此,这意味着,我的问题与那些多视图标签栏解决方案有点不同。因为在这些情况下,一次只显示1个视图。我希望4-5个视图叠加在彼此之上。

任何帮助?

1 个答案:

答案 0 :(得分:4)

你没错,你的视图控制器只能在UIView属性中有一个view。该视图当然可以用于包含其他子视图。

我要做的是让一个普通的UIView作为您的控制器的view,并让您的BallViews成为该视图的子视图。您的控制器仍然可以控制这些视图,它们不能都在view属性中。

编辑:如果您正在使用nib文件/ Interface Builder,添加BallView作为控制器视图的子视图非常简单 - 只需拖动UIView对象在视图上,在身份检查器中,您可以将视图的标识更改为BallView类。

如果您不使用IB,您也可以以编程方式执行相同的操作:

// BallViewController.h
@interface BallViewController
{
    BallView* ballView;
}

@end

// BallViewController.m
@implementation BallViewController

- (void) loadView
{
    ...

    CGRect frame1 = ...
    CGRect frame2 = ...

    self.view = [[UIView alloc] initWithFrame:frame1];

    ballView = [[BallView alloc] initWithFrame:frame2] retain];
    [self.view addSubview:ballView];

    ...
}

@end