как проверить, существует ли еще UIView?

я должен установить некоторые параметры пользовательского размера для UIView в соответствии с ориентацией устройства. я загружаю UIView, который НЕ имеет собственного контроллера представления, следующим образом:

в main.h

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

в мейн.м

@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 больше не доступен. я видел много примеров здесь, в stackoverflow, например

-(IBAction)showPopup:(id)sender {
    if(![[self myView] isDescendantOfView:[self view]]) { 
        [self.view addSubview:[self myView]];
    } else {
        [[self myView] removeFromSuperview];
}

or

-(IBAction)showPopup:(id)sender
{
    if (!myView.superview)
        [self.view addSubview:myView];
    else
        [myView removeFromSuperview];
}

or

if (!([rootView subviews] containsObject:[self popoverView])) { 
    [rootView addSubview:[self popoverView]];
} else {
    [[self popoverView] removeFromSuperview];

}

or

-(IBAction)showPopup:(id)sender {
    if([[self myView] superview] == self.view) { 
        [[self myView] removeFromSuperview];           
    } else {
        [self.view addSubview:[self myView]];         
    }
}

но ни один из них не работает. отладчик всегда выдает исключение из-за плохого доступа. что (с моей точки зрения) означает, что объект больше не существует. но как регистратор может получить к нему доступ после того, как я удалил его из супервизора и сказал (нулевой)?

я знаю, что было бы лучше дать представлению выделенный контроллер представления и поместить туда didRotateFromInterfaceOrientation, поэтому мне не нужно проверять, есть ли там socialActionView. во всяком случае, я хотел бы спросить, есть ли способ, как я могу проверить, является ли UIView (нулевым) или нет. прежде чем я изменю весь свой код на пару view/viewcontroller.

любые подсказки приветствуются!


person rockstarberlin    schedule 26.06.2012    source источник


Ответы (1)


Вы делаете это сохраненным свойством, а затем обходите атрибут сохранения, когда делаете это:

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

Если вы сделаете это self.socialActionView = ..., ваше свойство должно сохранять свою ссылку даже после того, как представление будет удалено из массива подвидов.

(На самом деле, я бы рекомендовал изменить оператор синтеза на @synthesize socialActionView = _socialActionView; и поставить self.socialActionView везде, где компилятор жалуется на этот символ.)

person Phillip Mills    schedule 26.06.2012
comment
КЛАССНО! это было правильно! большое спасибо! просто понять: что я там сделал? инициировал локальный экземпляр socialActionView? возможно ли это без приведения его в блок, где я его определяю? - person rockstarberlin; 27.06.2012
comment
Когда вы используете self., вы фактически используете невидимые методы, которые создает @synthesize, а не просто обновляете переменную экземпляра. Эти методы ведут себя в соответствии с атрибутами, которые вы указали в операторе @property. Таким образом, в этом случае использование методов соблюдает ваши retain; переход непосредственно к переменной не работает. - person Phillip Mills; 27.06.2012