UIView отображается сразу после загрузки NIB-файла?

я пытаюсь добавить UIView в свое приложение. это работает, но не так, как ожидалось. я определил socialActionView в моем заголовке и сделал @synthesize в своем контроллере представления.

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

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

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

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

РЕДАКТИРОВАТЬ

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


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


Ответы (2)


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

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

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

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

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

    [self.view addSubview:loadedView];
}

РЕДАКТИРОВАТЬ: поскольку вы хотите программно загрузить контроллер представления из .xib, вы можете сделать это так (предположительно, контроллер представления определен в MyViewController.h,.m,.xib):

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


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

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

[self.view addSubview: myViewController.view];
person Rok Jarc    schedule 29.05.2012
comment
Ах я вижу. я уже предполагал что-то подобное. но даже если я изменю его на это: UIView *socialActionView = [[[NSBundle mainBundle] loadNibNamed:@SocialActionViewController owner:self options:nil] objectAtIndex:0]; он по-прежнему сразу показывает UIView. это обычное поведение? мне просто интересно, для чего полезен addSubView, если он больше не нужен? - person rockstarberlin; 29.05.2012
comment
@rockstarberlin: Вам, вероятно, лучше сразу загрузить его, установив для свойства hidden значение YES, и просто показать его, когда пользователь нажмет кнопку. Но это зависит от структуры и иерархии вашего приложения, поэтому я действительно не могу сказать. - person Rok Jarc; 29.05.2012
comment
@rockstarberlin: Конечно, addSubview все еще нужен, просто в других случаях. Что касается вашего второго теста: это странно - компилятор должен как минимум выдать предупреждение - если у вас есть свойство и локальная переменная с одинаковым именем. - person Rok Jarc; 29.05.2012
comment
хм, да, возможно, вы правы. Я подумал, что лучше всего загружать вещи, пока они не понадобятся. Спасибо за ваш ответ. - person rockstarberlin; 29.05.2012
comment
Хорошо, подождите. я загружаю его первым при взаимодействии с пользователем. пока перо не загружено. так что все еще должно быть хорошо - person rockstarberlin; 29.05.2012
comment
Да, у вас все еще будет хорошо с вашим кодом (без дополнительных addSubView). Это просто немного сложнее, чем могло бы быть :) - person Rok Jarc; 29.05.2012
comment
Я только что провел еще несколько экспериментов. у меня были некоторые другие запутанные события с socialActionView. а потом я узнал, что мой socialActionView не помещается поверх текущего представления, а полностью его заменяет. Я установил альфа-канал socialActionView на 0,5 и увидел, что мой прежний вид исчез! как это может быть? что не так с моей структурой? или нельзя программно добавить подвид поверх текущего представления? - person rockstarberlin; 29.05.2012
comment
Конечно, это возможно. Но в этом случае происходит что-то еще, что не видно из описания в вашем вопросе. Подключен ли socialActionView к какому-то представлению в файле .XIB (через IBAction)? Мне нужно больше подробностей о том, как все настроено. - person Rok Jarc; 30.05.2012
comment
шаг за шагом я узнаю больше. я пытался создать специальный контроллер представления для loadNibNamed под названием SocialActionViewController. чего я не знал, так это того, что контроллеры полностью игнорируются, если я загружаю перо с помощью loadNibNamed. мне было интересно, на что ссылается owner:self. и кажется, что невозможно сослаться на что-то еще, кроме самого себя. в другом посте я заметил, что если я загружаю с помощью loadNibNamed, загружается только представление. классы контроллера не подключены и поэтому не выполняются. - person rockstarberlin; 30.05.2012
comment
я попытался прикрепить свойства в IB к представлению, чтобы ссылаться на scrollView, но это не помогло, потому что контроллер был проигнорирован. затем я определил свойства в MainView и - о чудо - это сработало. даже если я прикрепил scrollView в своем SocialActionView.xib к переменной с именем scroll1 в SocialActionViewController. кажется, что IB все равно подключился к ViewController. Теперь я удалил SocialActionViewController.h и SocialActionViewController.m и установил класс SocialActionView на ViewController и определил там свойства. - person rockstarberlin; 30.05.2012
comment
И теперь мне нужно вызвать [self.view addSubview:socialActionView]; показать вид. Все работает нормально. Мне только интересно, как я могу поместить представление поверх моего текущего представления, которое должно иметь собственный контроллер представления? - person rockstarberlin; 30.05.2012
comment
Надеюсь, вы найдете решение - на данный момент трудно, если не невозможно, увидеть, какова ваша текущая конфигурация и чего именно вы хотите достичь. Было бы лучше, если бы вы организовали эту дополнительную информацию и обновили свой вопрос с ее помощью. - person Rok Jarc; 30.05.2012
comment
Да, я сделал. Спасибо! Остался единственный вопрос: как я могу добавить UIView, у которого есть собственный UIViewController? - person rockstarberlin; 30.05.2012
comment
В этом случае вам нужно создать экземпляр второго viewController (и сохранить ссылку на него в ivar или как свойство) и добавить его представление в представление первого viewController. - person Rok Jarc; 31.05.2012
comment
хорошо, спасибо рокжарк. это то, что я хотел сделать. мне нужно найти несколько примеров для этого, так как кажется, что загрузка из nib загружает только элементы view contend и ui, но не контроллеры, поскольку мне это нужно. - person rockstarberlin; 31.05.2012
comment
Это оно! большое спасибо! я сделал это некоторое время назад однажды, но забыл, как это было сделано правильно, и только искал, как загрузить перо. но это был неправильный подход. создание экземпляра viewController - это все! - person rockstarberlin; 04.06.2012

если я создаю 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];
}

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

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

person rockstarberlin    schedule 29.05.2012