0

デバイスの向きに応じて、いくつかのカスタムサイズパラメータを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);

削除後、ログには(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]];         
    }
}

しかし、それらのどれも機能しません。デバッガーは常にアクセス不良の例外原因をスローします。(私の観点から)オブジェクトがもう存在しないことを意味するもの。しかし、スーパービューから削除して(null)と言った後、ロガーはどのようにアクセスできますか?

ビューに専用のビューコントローラーを指定し、didRotateFromInterfaceOrientationを配置したほうがよいので、socialActionViewが存在するかどうかを確認する必要はありません。とにかく、UIViewをチェックする方法があるかどうかを尋ねたいと思います(null)かどうか。すべてのコードをview/viewcontrollerのカップルに変更する前に。

ヒントをいただければ幸いです。

4

1 に答える 1

1

これを保持プロパティにし、これを行うときに保持属性をバイパスします。

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

その場合self.socialActionView = ...、ビューがサブビュー配列から削除された後でも、プロパティはその参照を保持する必要があります。

(実際、syntheticステートメントをに変更し、コンパイラーがそのシンボルについて文句を言うところならどこにでも@synthesize socialActionView = _socialActionView;置くことをお勧めします。)self.socialActionView

于 2012-06-26T22:24:02.557 に答える