在UIViewController中设置子视图

时间:2010-02-04 12:50:45

标签: iphone uiview uiviewcontroller subview

编辑:这个问题是由于很难理解Interface Builder和类中的属性是如何工作的。

为什么我不能设置self.mySubView = anoterhView;,就像设置self.view = anotherView;

一样
## .h
@interface TestController : UIViewController {
    IBOutlet UIView *mySubView;
}

@property (nonatomic, retain) IBOutlet UIView *mySubView;

##.m

@implements TestController

@synthesize mySubView;

- (void)viewDidLoad { 

    AnotherController *anotherController = [[AnotherController alloc] initWithNibName:nil bundle:nil];
    anotherView = anotherController.view;

    // if i do
    self.view = anotherView;
    // result: replaces whole view with anotherView

    // if i instead do
    self.mySubView = anotherView;
    // result: no change at all

    // or if i instead do:
    [self.mySubView addSubview:anotherView];
    // result: mySubView is now displaying anotherView

}

注意:我正在使用interfacebuilder。我确定一切都很好,因为self.view和self.mySubView addSubview:工作正常..

4 个答案:

答案 0 :(得分:2)

要让它自动显示在self.view上,您需要覆盖您的setter方法,例如:

- (void)setMySubView:(UIView *)view {
    [mySubView removeFromSuperview];  // removing previous view from self.view
    [mySubView autorelease];
    mySubView = [view retain];
    [self.view addSubview: mySubView]; // adding new view to self.view
}

答案 1 :(得分:1)

mySubview 是一个属性,它是对UIView对象的引用。因此,当您为其分配 UIView 对象时,您只是更改了 mySubview 所指的内容,而不再像这种情况那样,

self.mySubview = anotherView;

mySubview 引用的原始UIView对象仍然在视图子视图属性中引用。什么都没有改变。

但是当您将 anotherView 添加为 mySubview 的子视图时, anotherView 属于视图层次结构并显示在屏幕上。所以这很有效。

view (parent of) mySubview (parent of) anotherView

但是,当您将 anotherView 直接分配到视图时,您不仅会更改正在引用的UIView对象视图,而且还会自行添加到parentView。这由 UIViewController 处理。

self.view = anotherView;



您的 setCurrentView 应该更像这样,

- (void) replaceSubview:(UIView *)newView {
  CGRect frame = mySubview.frame;

  [mySubview removeFromSuperview];
  self.mySubview = newView;

  [self.view addSubview:newView];
  newView.frame = frame;
}



答案 2 :(得分:0)

作为对@beefon所说的回应。这有点像预期的那样,但背景颜色是透明的。它也没有回应......按钮没有按下等等。

- (void)setCurrentView:(UIView *)newView {
    /*      1. save current view.frame: CGRect mySubViewFrame = [mySubView frame]; 
            2. remove and put new subview - I have wrote how to do it 
            3. set new frame for new view: [mySubView setFrame:mySubViewFrame];      */ 
    CGRect currentViewFrame = [currentView frame];
    [currentView removeFromSuperview];
    [currentView autorelease];
    currentView = [newView retain];
    [self.view addSubview:currentView];
    [currentView setFrame:currentViewFrame]; 
}

答案 3 :(得分:-1)

您的实例变量必须是属性才能使用该点。语法,使用:

@Property (nonatomic, retain) IBOutlet UIView* subview;
标题中的

,并使用:

@synthesize subview;

在主文件中。

为了使用点设置UIView。你需要将它作为属性的语法。这也允许您在类外设置subview的属性。