Приложение вылетает из-за WebView - PullRequest
0 голосов
/ 07 февраля 2011

В моем приложении я использую UIwebview для отображения веб-сайтов, однако всякий раз, когда я нажимаю кнопку «Назад» и начинаю играть с другими частями в приложении, приложение в большинстве случаев падает без причины. Я подозреваю, что веб-просмотр вызывает эту проблему, потому что происходит сбой только при попытке открыть веб-просмотр.

Я использовал NSURLConnection для загрузки веб-просмотра и сделал веб-просмотр, объекты подключения к nil в представлении будут исчезать методом.

@implementation NewsWebSiteViewController

@synthesize connection,rcvdData,spinner1,currentSite,webView,newsWebsite;

- (void)viewDidLoad {
    [super viewDidLoad];
    @try {
        self.webView.delegate=self;
        [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
        self.title= self.newsWebsite.title;
        self.webView.backgroundColor =[UIColor groupTableViewBackgroundColor];
        self.spinner1 = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        CGRect center = [self.view bounds];
        CGSize winCenter = center.size;
        CGPoint pont = CGPointMake(winCenter.width/2,winCenter.height/2);
        [spinner1 setCenter:pont];
        [self.view addSubview:spinner1];
        [self.spinner1 startAnimating];
        NSString *url = newsWebsite.link;
        NSURLRequest *theReq =[NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
        self.connection = [[NSURLConnection alloc] initWithRequest:theReq delegate:self];
        if(self.connection) {
            self.rcvdData = [[NSMutableData data] retain];
        }
        else {
        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error!" message:@"We are having a problem connecting to the internet, why not try again or try sometime later!.." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
        [alert show];
        }
        webView.multipleTouchEnabled=YES;
        webView.scalesPageToFit=YES;
    }
    @catch (NSException * e) {
        }  
}

-(void) goBack {
    self.webView =nil;
    [self.navigationController popViewControllerAnimated:YES];
}

-(void) viewWillDisappear:(BOOL)animated {

    [self.connection cancel];
    self.connection=nil;
    [self.webView stopLoading];
    self.webView=nil;

    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

    if (self.spinner1 ==nil) {

    }

    else {
        [self.spinner1 stopAnimating];
    }

}

-(void) webViewDidFinishLoad:(UIWebView *)webView {

    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

    if (self.spinner1 ==nil) {

    }
    else {
        [self.spinner1 stopAnimating];
    }
}

-(void) viewDidAppear:(BOOL)animated  {
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}


- (void)viewDidUnload {
    [super viewDidUnload];
}


-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [self.rcvdData setLength:0];
}


-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.rcvdData appendData:data];
}


-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    if (self.spinner1 ==nil) {
        }
    else {
        [self.spinner1 stopAnimating];
        }
    [connection release];
    [rcvdData release];
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error!" message:@"We are having a problem connecting to the internet, why not try again or try sometime later!.." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [alert show];
}


-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];
    [rcvdData release];
    NSString *url = newsWebsite.link;
    NSURL *url1 =  [NSURL URLWithString:url];
    [self.webView loadData:self.rcvdData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:url1];
}

- (void)dealloc {
    [super dealloc];
    [self.spinner1 release];
}

@end

1 Ответ

1 голос
/ 07 февраля 2011

Во-первых, вот небольшой пример равенства / неравенства в C / Objective-C:

Допустим, у вас есть значение BOOL (то есть значение, которое может быть либо ДА, либо НЕТ, «Вкл.» Или «Выкл.», «Истина» или «Ложь»), называемое isEnabled. Теперь, если бы я присвоил этому BOOL значению (иногда называемому 'флагом') значение 'YES', я мог бы условно проверить его значение следующим образом:

BOOL isEnabled = YES;

if (isEnabled)
{
   // value set to yes
}

В дополнение к вышесказанному я могу использовать оператор отрицания (восклицательный знак - также известный как оператор NOT), чтобы перевернуть значение isEnabled и проверить его противоположное значение:

BOOL isEnabled = YES;

// the following reads as "if is *not* enabled"
if (!isEnabled)
{
   // value set to no
}

теперь, конечно, в приведенном выше примере isEnabled установлено на YES, поэтому условие не будет выполнено. Но, если мы рассмотрим следующий пример, свойство if, при котором, если else if 'встречается' (т. Е. Истинно) в любом месте из серии if и else if, оно выполнится весь код внутри него, а затем игнорируйте все остальное:

BOOL isEnabled = NO;

if (isEnabled)
{
   // any code here will not run, as the above if condition will be false
}
else if (!isEnabled)
{
   // this code will run, since the above condition (!isEnabled) will evaluate to true
}
else if (isEnabled)
{
   // this code could never run, since the previous condition was true and all following else if's are ignored
}
else if (!isEnabled)
{
   // this code could never run, since the previous condition was true and all following else if's are ignored
}

, хотя у приведенного выше есть два избыточных else if в конце, это хороший способ продемонстрировать, как работает условный код.

Таким образом, в вашем методе webViewDidFinishLoad: вместо пробела для оценки условия if / else вы можете заменить его более простым условием:

-(void) webViewDidFinishLoad:(UIWebView *)webView 
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

    // or, (self.spinner1 != nil)
    if (!self.spinner1) 
    {
        [self.spinner1 stopAnimating];
    }
}

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

...