Почему shouldStartLoadWithRequest вызывается только в первый раз?

Я пытаюсь отобразить список веб-страниц, которые пользователь может переключать в моем приложении. Я сделал это успешно с документами. однако я не хочу, чтобы пользователь мог перемещаться по этим страницам. Я узнал, как это сделать, посмотрев. Проблема в том, что он выполняется только на первой странице. Когда я переключаюсь на другую страницу, mustStartLoadWithRequest перестает работать, даже когда я возвращаюсь на первую страницу. (Все это делается с помощью моих специально разработанных кнопок "назад" и "вперед".) Как я могу исправить это так, чтобы он вызывался каждый раз и не давал пользователю нажимать на ссылки и переходить из моих установленных страниц? Я новичок в объективе-c. Весь соответствующий код ниже. Некоторые вещи были объявлены глобально в.h. Извините, это немного грубо. Я вкладывал только то, что было необходимо, чтобы преобразовать код в форматирование. Спасибо!

Мой.h файл:

#import <UIKit/UIKit.h>

@interface learnViewController : UIViewController <UINavigationControllerDelegate>
{
    IBOutlet UIWebView *web;
    UIButton *backButton;
    UIButton *forButton;
}
@end

Мой.m файл

#import "learnViewController.h"
#import "ViewController.h"

static NSString* links[] =
{
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000141.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000065.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/001087.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000091.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/007270.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000145.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000093.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000087.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000140.htm",
    @"http://www.nlm.nih.gov/medlineplus/ency/article/000132.htm"
};
int numlinks = 10;
int i = 0;

@interface learnViewController ()

@end

@implementation learnViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    float viewWidth = self.view.frame.size.width;
    float viewHeight = self.view.frame.size.height;

    self.view.multipleTouchEnabled = true;
    //Background
    UIImageView *backgroundView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)];
    backgroundView.image = [UIImage imageNamed:@"Background.png"];
    [self.view addSubview:backgroundView];
    //Show Portal
    web = [[UIWebView alloc]initWithFrame:CGRectMake(0.0, viewHeight/34.0, viewWidth, (viewHeight - viewHeight/6.4))];
    self->web.delegate = self;
    web.scrollView.scrollEnabled = TRUE;
    web.scalesPageToFit = TRUE;
    [self loadDocument:links[i] inView:web];
    [self.view addSubview:web];
    //Buttons
    UIButton *homeButton = [[UIButton alloc] initWithFrame:CGRectMake((viewWidth/2.0 - viewWidth/6.0/2.0), (viewHeight - viewHeight*280.0/2208.0/2.0 - viewWidth/6.0/2.0), (viewWidth/6.0), (viewWidth/6.0))];
    [homeButton
     setBackgroundImage:[UIImage imageNamed:@"Home.png"]
     forState:UIControlStateNormal];
    [homeButton addTarget:self action:@selector(homePressed:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:homeButton];

    backButton = [[UIButton alloc] initWithFrame:CGRectMake((viewWidth/2.0/3.5 - viewWidth/9.0/2.0), (viewHeight - viewHeight*280.0/2208.0/2.0 - viewWidth/9.0/2.0), (viewWidth/9.0), (viewWidth/9.0))];
    [backButton
     setBackgroundImage:[UIImage imageNamed:@"Back.png"]
     forState:UIControlStateNormal];
    backButton.enabled = FALSE;
    [backButton addTarget:self
                   action:@selector(backPressed:)
         forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:backButton];

    forButton = [[UIButton alloc] initWithFrame:CGRectMake((viewWidth/2.0/3.5*2.0 - viewWidth/9.0/2.0), (viewHeight - viewHeight*280.0/2208.0/2.0 - viewWidth/9.0/2.0), (viewWidth/9.0), (viewWidth/9.0))];
    [forButton
     setBackgroundImage:[UIImage imageNamed:@"Forward.png"]
     forState:UIControlStateNormal];
    [forButton addTarget:self
                  action:@selector(forPressed:)
        forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:forButton];

    UIButton *refButton = [[UIButton alloc] initWithFrame:CGRectMake((viewWidth - viewWidth/2.0/3.5*2.0 - viewWidth/9.0/2.0), (viewHeight - viewHeight*280.0/2208.0/2.0 - viewWidth/9.0/2.0), (viewWidth/9.0), (viewWidth/9.0))];
    [refButton
     setBackgroundImage:[UIImage imageNamed:@"Scale.png"]
     forState:UIControlStateNormal];
    [refButton addTarget:self
                  action:@selector(refPressed:)
        forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:refButton];

    UIButton *webButton = [[UIButton alloc] initWithFrame:CGRectMake((viewWidth - viewWidth/2.0/3.5 - viewWidth/9.0/2.0), (viewHeight - viewHeight*280.0/2208.0/2.0 -     viewWidth/9.0/2.0), (viewWidth/9.0), (viewWidth/9.0))];
    [webButton
     setBackgroundImage:[UIImage imageNamed:@"Web.png"]
     forState:UIControlStateNormal];
    [webButton addTarget:self
                  action:@selector(webPressed:)
        forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:webButton];
}
//Button presses
-(void)homePressed:(id)sender
{
    ViewController *home = [[ViewController alloc] initWithNibName:nil bundle:nil];
    [self presentViewController:home animated:YES completion:NULL];
}

- (void) refPressed:(id)sender
{
    [self loadDocument:links[i] inView:web];
}

-(void)backPressed:(id)sender
{
    float viewWidth = self.view.frame.size.width;
    float viewHeight = self.view.frame.size.height;
    if (i > 0)
    {
        [web removeFromSuperview];
        i--;
        web = [[UIWebView alloc] initWithFrame:CGRectMake(0.0, viewHeight/34.0, viewWidth, (viewHeight - viewHeight/6.4))];
        [self loadDocument:links[i] inView:web];
        web.scrollView.scrollEnabled = TRUE;
        web.scalesPageToFit = TRUE;
        [self.view addSubview:web];
        forButton.enabled = TRUE;
    }
    if (i == 0)
    {
        backButton.enabled = FALSE;
    }
}

-(void)forPressed:(id)sender
{
    float viewWidth = self.view.frame.size.width;
    float viewHeight = self.view.frame.size.height;
    if (i < numlinks - 1)
    {
        [web removeFromSuperview];
        i++;
        web = [[UIWebView alloc] initWithFrame:CGRectMake(0.0, viewHeight/34.0, viewWidth, (viewHeight - viewHeight/6.4))];
        [self loadDocument:links[i] inView:web];
        web.scrollView.scrollEnabled = TRUE;
        web.scalesPageToFit = TRUE;
        [self.view addSubview:web];
        backButton.enabled = TRUE;
    }
    if (i == numlinks - 1)
    {
        forButton.enabled = FALSE;

    }
}

-(void)loadDocument:(NSString*)documentName inView:(UIWebView*)webView
{
    NSString *url = links[i];
    NSURL *nsurl = [NSURL URLWithString:url];
    NSURLRequest *nsrequest = [NSURLRequest requestWithURL:nsurl];
    [webView loadRequest:nsrequest];
}

-(void)webPressed:(id)sender
{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:links[i]]];
}

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = request.URL;
    NSString *urlString = url.absoluteString;
    NSRange range = [urlString rangeOfString:links[i]];
    if (range.location != NSNotFound)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

- (void)viewDidUnload
{
    [self->web stopLoading];
    self->web.delegate = nil;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

1 ответ

Хорошо, я понял это методом проб и ошибок, так как никто не хотел мне помочь. Я пытался искать ответы на похожие вопросы, но на самом деле у меня ничего не получалось. Если вы читаете это и имеете ту же проблему, это то, как вы это исправляете. Все, что вам нужно сделать, это сбросить веб-делегата на ноль, а затем вернуться к себе, как показано ниже:

self.webView.delegate = nil;
self.webView.delegate = self;

Я не знаю, почему код всех остальных был таким сложным, и я могу только догадываться, почему это работает. Честно говоря, мне просто повезло, но я думаю, что когда вы делаете это, возможно, он очищает кеш, тем самым делая каждую страницу свежей для программы. Об этом говорили другие люди. Однако их методы не сработали для меня из-за недостатка опыта или из-за того, что они не соответствуют моему конкретному случаю. Это намного проще и гарантированно будет работать при условии, что вы будете делать это каждый раз, когда загружаете одну из указанных веб-страниц. Пожалуйста, если вы читаете это. Если кто-то так любезно посмотрит на мой пост и объяснит, почему это работает более подробно, пожалуйста, не стесняйтесь!

Другие вопросы по тегам