编辑:这个问题是由于很难理解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:工作正常..
答案 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
的属性。