2012-05-29 4 views
3

Я пытаюсь добавить UIView в свое приложение. он работает, но не так, как ожидалось. Я определил socialActionView в своем заголовке и сделал @synthesize в моем контроллере представления.UIView показывает сразу после загрузки NIB-файла?

nib-файл загружается, когда пользователь нажимает кнопку. Я думал, что мне нужно вызвать метод addSubview, чтобы показать представление. но он появляется даже, я не делаю этого.

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

Может кто-нибудь объяснить, что здесь происходит? Я этого не понимаю.

- (IBAction)didTapOkSocialAction:(id)sender; 
{ 
    self.socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0]; 
    //[self.view addSubview:socialActionView]; 
} 

EDIT

в данном случае решение было установить file's владельца моего SocialActionViewController.xib к ViewController.h. Я еще не знаю, как добавить UIView из NIB, подключенного к другому классу контроллера представлений, чем контроллер вида, в который загружается представление.

ответ

2

Ваш socialActionView уже привязан к окну просмотра в своем обзоре.

Итак: его уже там (его ссылка уже добавлена ​​как подзаголовок), но это nil, пока вы его не загрузите.

РЕДАКТИРОВАТЬ: неясно, как у вас есть все, что связано с этим, но из вашей добавленной информации ниже я приду нею.

Попробуйте этот код:

- (IBAction)didTapOkSocialAction:(id)sender; 
{ 
    UIView *loadedView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0]; 

    [self.view addSubview:loadedView]; 
} 

EDIT: так как вы хотите, чтобы программно загрузить ViewController из .xib вы можете сделать это так (допустим ViewController определяется в MyViewController.h, .м, .xib) :

MyViewController *myViewController; //as an ivar or a property in @interface 


myViewController = [[ViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 

, то вы можете добавить его мнение:

[self.view addSubview: myViewController.view]; 
+0

ах я вижу. Я уже принял что-то подобное. но даже если я его сменил на это: UIView * socialActionView = [[[NSBundle mainBundle] loadNibNamed: @ "SocialActionViewController" владелец: self options: nil] objectAtIndex: 0]; он по-прежнему показывает UIView сразу. это обычное поведение? Мне просто интересно, для чего полезен addSubView, если он больше не нужен? – rockstarberlin

+0

@rockstarberlin: Вероятно, вам лучше было бы сразу загрузить его с помощью свойства 'hidden', установленного на' YES', и просто отобразить его, когда пользователь нажмет кнопку. Но это зависит от структуры и иерархии вашего приложения, поэтому я действительно не мог сказать. –

+0

@rockstarberlin: Конечно, addSubview по-прежнему необходим, как раз в других случаях.Что касается вашего второго теста: это странно - компилятор должен хотя бы выпустить предупреждение - если у вас есть свойство и локальная переменная с тем же именем. –

2

если я создать UIView программно например

- (IBAction)didTapOkSocialAction:(id)sender; 
{ 
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)]; 
    myView.backgroundColor = [UIColor whiteColor]; 
    [self.view addSubview:myView]; 
    [myView release]; 
} 

then addSubView неизбежен. иначе myView не появится. Я проверил это. но кажется, что существует другое поведение, если UIView загружен из наконечника. он появляется немедленно.

во втором тесте я удалил свойство, осталась только локальная переменная.

Смежные вопросы