2012-06-26 8 views
0

장치 방향에 따라 사용자 정의 크기 매개 변수를 UIView에 설정해야합니다. main.mUIView가 아직 있는지 확인하는 방법은 무엇입니까?

@synthesize socialActionView; 

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

main.h에 : 나는 다음과 아닌 자신의 ViewController으로이 에 UIView를로드합니다. . .

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

더 이상 필요 나는이

- (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)]; 
     } 
    } 
} 
같이 할

크기 조정 제거 후 로그는 말한다

[self.socialActionView removeFromSuperview]; 
NSLog(@"%@",self.socialActionView.superview); 

(널)과 수퍼에서 제거되지 않은 경우

는 지금까지 기본보기에서 하위보기 (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]];   
    } 
} 

같은 유래 여기에 예를 많이 볼 수 있지만, 그들 중 누구도 작동하지 않습니다 i've. 디버거는 항상 잘못된 액세스의 예외 원인을 throw합니다. 내 관점에서 볼 때 객체가 더 이상 존재하지 않는다는 것을 의미합니다. 하지만 로거가 superview에서 제거하고 (null)라고 말한 후 어떻게 로거에 액세스 할 수 있습니까?

전용보기 컨트롤러에 전용보기 컨트롤러를 지정하고 didRotateFromInterfaceOrientation을 넣어두면 좋을 것입니다. 따라서 socialActionView가 있는지 확인하지 않아도됩니다. 어쨌든 내가 UIView가 (null)인지 검사 할 수있는 방법이 있는지 묻고 싶습니다. 모든 코드를 뷰/뷰 컨트롤러 쌍으로 변경하기 전에.

감사합니다.

답변

1

당신은 그것을 유지 특성을 다음 당신이 할 때이 속성을 유지 우회하는이 : 당신이 self.socialActionView = ... 재산 뷰가 파단 배열에서 제거 된 후에도 해당 참조를 유지해야 할 경우

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

.

는 (사실, 난 @synthesize socialActionView = _socialActionView;에 합성 문을 변경하고 컴파일러가 해당 심볼에 대해 불평 곳마다 self.socialActionView을 넣어 권하고 싶습니다.)

+0

AWESOME! 그 말이 맞았 어! 고마워요! 단지 이해할 수 있습니다 : 내가 거기서 무엇을 했습니까? socialActionView의 로컬 인스턴스를 시작 했습니까? 내가 그것을 정의하는 블록에 캐스팅하지 않고 가능한가? – rockstarberlin

+0

'self.'를 사용하면 실제로 인스턴스 변수를 업데이트하는 것보다'@ synthesize'가 만드는 보이지 않는 메소드를 사용하게됩니다. 이러한 메소드는'@ property' 문에 두는 속성에 따라 작동합니다. 그래서,이 경우, 방법을 통해가는 것은 당신의 '보유'를 존중합니다; 직접 변수로 이동하지 않습니다. –

관련 문제