Почему мой In-App Browser не загружается? - PullRequest
2 голосов
/ 01 июня 2011

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

Моя архитектура выглядит примерно так: подкласс UIViewController: uiviewcon который загружается из его кончика:

  • UIWebView
  • верхняя и нижняя панель с элементами пользовательского интерфейса, такими как вперед, назад, ...

После того, как я создал экземпляр uiviewcon, я вызываю следующий метод:

-(void)loadrequest:(NSURLRequest *)urlrequest{
    [webView loadRequest:urlrequest];
}

webview - это IBOutlet для UIWebView в моем кончике. Однако, похоже, что webView - это ноль (я проверял if (webView) ..., и я определенно подключил его в IB)

Каковы возможные причины того, что мой webView не выделен? Я реализовал некоторые методы протокола UIWebViewDelegate в uiviewcon (установите self в качестве делегата в viewDidLoad из uiviewcon), но ни один из них не вызывается (кажется разумным, поскольку webView равен nil).

Как я могу улучшить свой код, чтобы мой браузер наконец-то что-то загрузил?

РЕДАКТИРОВАТЬ: мой заголовок uiviewcon:

@protocol CustomWebViewDelegate
-(void)hidecustomwebview;
@end

@interface CustomWebView : UIViewController<UIWebViewDelegate> {
    UIActivityIndicatorView *spinner;
    UIWebView *webView;
}
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *spinner;
@property (nonatomic, retain) IBOutlet UIWebView *webView;
@property (nonatomic,assign) id <CustomWebViewDelegate>delegate;
-(void)webViewDidStartLoad:(UIWebView *)webView;
-(void)webViewDidFinishLoad:(UIWebView *)webView;
-(void)loadrequest:(NSURLRequest *) urlrequest;
-(IBAction)hideme;
@end

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Ваши элементы представления создаются только при необходимости.Это означает, что первая ссылка на свойство view контроллера (внутренне из UIKit или ссылка в любом месте вашего кода на «self.view») запускает процесс фактического создания всех элементов, которые вы имеете в своем кончике.

Таким образом, пока вышеописанный процесс не будет выполнен, ваше свойство webView будет равно нулю.Скорее всего, вы звоните loadRequest до того, как ваш взгляд был создан.Решением вашей проблемы было бы просто измениться, когда вызывается loadRequest.

Так что будет подходящим временем для вызова loadRequest?Есть три возможности:

1) Если вы вызываете loadRequest из CustomWebView, вы можете поместить этот код в viewDidLoad

2) Если вам нужно вызвать loadRequest извне CustomWebView,вы можете подождать, когда вы впервые представите этот контроллер (скажем, с помощью presentModalViewController:animated: или поместив свой контроллер в стек навигации), а затем вызовите loadRequest.

Таким образом, ваш код может выглядеть примерно так:

NSURLRequest *someRequest = nil; //Assume this has some valid value

CustomWebView *myWebView = [[CustomWebView alloc] init]; //Plus other nib niceties
[self presentModalViewController:myWebView];
[myWebView loadRequest:someRequest];                     //View has been created, 
                                                         //loadRequest will work.

вместо того, что изначально могло быть:

NSURLRequest *someRequest = nil; //Assume this has some valid value

CustomWebView *myWebView = [[CustomWebView alloc] init]; //Plus other nib niceties
[myWebView loadRequest:someRequest];                     //Your view is not created yet, loadRequest won't work.
[self presentModalViewController:myWebView];             

3) Если вы не можете выполнить вышеизложенное, и ДОЛЖНЫ иметь возможность вызывать loadRequest в любой момент времени, независимо от того, когда вы выберетена presentModalViewController или pushViewController, всегда есть хак для сохранения дня:)

Хак, просто обратитесь к self.view в методе init вашего CustomWebView, и вы можете быть уверены, чтовид был настроен сразу после 'init'.Неважно, как вы ссылаетесь на self.view, подойдет даже что-то вроде [self.view setNeedsLayout].Как я уже сказал, это не имеет значения.

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

1 голос
/ 01 июня 2011

Вы подключили виджет UIWebView к выходу webView в окне Interface Builder?Если вы не видите этой страницы о том, как это сделать.

Вы также должны позаботиться, когда вызываете метод loadRequest.Одним из безопасных мест для этого является метод viewDidLoad, при котором вам гарантированно подключен IBOutlet.

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