2012-06-26 48 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'語句中放置的屬性來運行。因此,在這種情況下,通過這些方法來尊重你的「保留」;直接進入變量不。 –

相關問題