я должен установить некоторые параметры пользовательского размера для 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.
любые подсказки приветствуются!