2012-06-26 36 views
0

我必须根据设备方向将一些自定义大小参数设置为UIView。我加载的具有不是自己的ViewController如下所述的UIView:如何检查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); 

日志说(空)删除

大小的调整我喜欢这个

- (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不再可访问。从来就在这里看到了很多的例子在计算器一样

-(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]];   
    } 
} 

但他们没有工作。调试器总是抛出异常导致访问不良。 (从我的角度来看)意味着物体不再存在。但是如果记录器从超级视图中删除它并说(空),它如何访问它?

我知道给视图一个专用的视图控制器并把didRotateFromInterfaceOrientation放在那里会更好,所以我不必检查socialActionView是否存在。无论如何,我想问是否有办法如何我可以检查的UIView是(空)也没有。在我将所有代码更改为view/viewcontroller之前。

任何提示赞赏!

回答

1

你使它成为一个保留的属性,然后绕过当你这样做的保留属性此:

socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0]; 

如果你作出这样的self.socialActionView = ...你的财产应持有其参考的画面从子视图数组中删除后也。

(事实上,我建议你改变你的综合声明@synthesize socialActionView = _socialActionView;并把一个self.socialActionView的地方,编译器会抱怨该符号。)

+0

真棒!那是对的!非常感谢!只是为了了解:我在那里做了什么?发起了一个socialActionView的本地实例?这是可能的,而不是在我定义它的区块中投射它? – rockstarberlin

+0

当你使用'self.'时,你实际上正在经历'@ synthesize'创建的不可见方法,而不仅仅是更新一个实例变量。这些方法根据您在'@ property'语句中放置的属性来运行。因此,在这种情况下,通过这些方法来尊重你的“保留”;直接进入变量不。 –

相关问题