我必须根据设备方向为UIView设置一些自定义尺寸参数。我加载了没有自己的viewcontroller 的UIView,如下所示:
在main.h中
@property (nonatomic, retain) IBOutlet UIView *socialActionView;
在main.m
中@synthesize socialActionView;
。 。
socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];
[self.view addSubview:socialActionView];
如果不再需要我将其从超级视图中删除
[self.socialActionView removeFromSuperview];
NSLog(@"%@",self.socialActionView.superview);
日志在删除后显示(null)
尺寸调整我喜欢这个
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if ((self.interfaceOrientation == UIDeviceOrientationPortrait) || (self.interfaceOrientation == UIDeviceOrientationPortraitUpsideDown)){
if (self.socialActionView != NULL) {
[self.socialActionView setBounds:CGRectMake(0, 0, 320, 480)];
[self.socialActionView setCenter:CGPointMake(160, 240)];
[self.scroll1 setContentSize:CGSizeMake(320, 600)];
[self.scroll1 setBounds:CGRectMake(0, 0, 320, 428)];
[self.scroll1 setCenter:CGPointMake(160, 266)];
}
} else if((self.interfaceOrientation == UIDeviceOrientationLandscapeLeft) || (self.interfaceOrientation == UIDeviceOrientationLandscapeRight)){
if (self.socialActionView != NULL) {
[self.socialActionView setBounds:CGRectMake(0, 0, 480, 320)];
[self.socialActionView setCenter:CGPointMake(240, 160)];
[self.scroll1 setContentSize:CGSizeMake(480, 600)];
[self.scroll1 setBounds:CGRectMake(0, 0, 480, 268)];
[self.scroll1 setCenter:CGPointMake(240, 186)];
}
}
}
到目前为止工作正常,直到我从主视图中删除子视图(socialAcitonView)。之后,self.socialActionView不再可访问。我已经在stackoverflow上看到了很多例子,比如
-(IBAction)showPopup:(id)sender {
if(![[self myView] isDescendantOfView:[self view]]) {
[self.view addSubview:[self myView]];
} else {
[[self myView] removeFromSuperview];
}
或
-(IBAction)showPopup:(id)sender
{
if (!myView.superview)
[self.view addSubview:myView];
else
[myView removeFromSuperview];
}
或
if (!([rootView subviews] containsObject:[self popoverView])) {
[rootView addSubview:[self popoverView]];
} else {
[[self popoverView] removeFromSuperview];
}
或
-(IBAction)showPopup:(id)sender {
if([[self myView] superview] == self.view) {
[[self myView] removeFromSuperview];
} else {
[self.view addSubview:[self myView]];
}
}
但它们都不起作用。调试器总是抛出异常导致访问不良的原因。什么(从我的角度来看)意味着对象不再存在。但是,在我从superview中删除后,记录器如何访问它并说出(null)?
我知道最好给视图一个专用的视图控制器并将didRotateFromInterfaceOrientation放在那里,所以我不必检查socialActionView是否存在。无论如何我想问一下我是否有办法检查UIView是否(null)也不是。在我将所有代码更改为view / viewcontroller之前。
任何提示赞赏!
答案 0 :(得分:1)
您正在使其成为保留属性,然后在执行此操作时绕过retain属性:
socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];
如果您使self.socialActionView = ...
即使从子视图数组中移除视图后,您的属性也应保留其引用。
(事实上,我建议将您的syntize语句更改为@synthesize socialActionView = _socialActionView;
,并在编译器抱怨该符号的位置放置self.socialActionView
。)