Доступ к self.view.frame в loadView вызывает сбой EXC_BAD_ACCESS - PullRequest
9 голосов
/ 21 августа 2011

У меня есть следующее в контроллере представления (где webView - переменная экземпляра типа UIWebView):

- (void)loadView
{
    webView = [[UIWebView alloc]initWithFrame:self.view.frame];
    [self.view addSubview:webView];
}

Первая строка, выделяющая веб-представление, вызывает сбой -Я получаю EXC_BAD_ACCESS и сообщение в консоли:

Предупреждение: невозможно восстановить ранее выбранный кадр

Я не понимаю, что вызвало сбой;self.view.frame определенно является CGRect.

Ответы [ 4 ]

7 голосов
/ 21 августа 2011

Вы не можете использовать self.view accessor внутри loadView, вы можете использовать только сеттер. Причина в том, что метод доступа view в UIViewController загружает представление (если оно еще не загружено), и, поскольку вы уже находитесь в loadView (загрузка представления), это вызовет бесконечный рекурсивный цикл.

Если вы будете следовать шаблону для loadView из этого ответа , вы захотите сделать это так:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];   // don't forget to release
6 голосов
/ 21 августа 2011

Поскольку вы используете метод loadView, вы должны вручную создать свою собственную иерархию представлений. Поскольку UIWebView является подклассом UIView, вы можете просто написать свой метод loadView следующим образом:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];

Или вы можете пропустить использование loadView и просто поместить его в метод viewDidLoad следующим образом:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:webView];
[webView release];

Для дальнейшего уточнения причин сбоя вашего приложения, когда создается экземпляр UIViewController, его представление создается неправильно. Это называется отложенной загрузкой, поэтому вы пытаетесь получить доступ к значению, которое еще не существует.

1 голос
/ 21 августа 2011

Вы пытаетесь получить доступ к фрейму вида, даже не создавая вид. Вы можете создать представление и назначить его как self.view или просто позвонить [super loadView]. Попробуйте приведенный ниже код.

- (void)loadView {

    [super loadView];
    webView = [[UIWebView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:webView];
}
0 голосов
/ 21 августа 2011

Я думаю, что self.view.frame не существует, когда вызывается loadView.Вы можете поместить этот код в viewDidLoad, где загружен self.view и известен кадр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...