如何防止UIwebView刷新?

时间:2014-03-09 00:24:02

标签: ios iphone uiwebview

我制作了一个应用程序,其中包含许多在UIwebview中加载的PDF文件。每当我打开PDF,关闭它,然后再回到它,文件再次从顶部开始,它重新加载。我不希望一旦用户退出文件并重新加载它就重新加载。

我的代码示例如下。

(void)viewDidLoad
{
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.

        NSString *path = [[NSBundle mainBundle] pathForResource:@"HnonC" ofType:@"pdf"];
        NSURL *url = [NSURL fileURLWithPath:path];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [Webview loadRequest:request];
        [Webview setScalesPageToFit:YES];

        [super viewDidLoad];
}

1 个答案:

答案 0 :(得分:1)

实际上,我不认为UIWebView是“令人耳目一新”。这将假定相同的UIWebView。由于您发布了-viewDidLoad代码,实际发生的是您正在创建一个全新的UIViewController,其新属性也是新创建的。

我能想到的唯一方法是阻止这种情况发生strong属性UIViewController,以便当你将它从屏幕上弹出时它不被破坏(我是假设您通过将其从UINavigationController堆栈的顶部弹出来“关闭”它。这可以解释为什么您的viewDidLoad代码多次运行,因为每UIViewController个实例只运行一次。

因此,在您的AppDelegate(或其他应用级单例对象)中,创建一个这样的属性:

@property (strong, nonatomic) UIViewController *pdfViewController;

然后,当需要加载PDF以供查看时,您可以检查此属性是否已存在,如果是,则只需按下已在内存中的UIViewController即可。这应该保持用户在弹出UIViewController时看到的相同视图。我认为这样的事情会起作用(假设这段代码在IBAction或其他东西中):

AppDelegate *del = [[UIApplication sharedApplication] delegate];
UIViewController *pdfViewController = del.pdfViewController;
if (pdfViewController == nil) {
    pdfViewController = // Some code to create the view controller
    del.pdfViewController = pdfViewController;
} 
[self.navigationController pushViewController:pdfViewController];

您可以选择性地覆盖某些视图生命周期方法来选择所发生的事情:

  • -viewDidLoad:每个实例调用一次
  • -viewWillAppear:每次按下/显示视图控制器时调用
  • -viewDidAppear:每次按下/显示视图控制器时调用

当然,如果您希望有选择地显示 多个 PDF文件之一,您还需要具有描述当前正在显示哪个PDF的属性。是否为每个PDF文件创建不同的UIViewController实例(并保留其属性)取决于您。这绝对是您具体问题的问题。在同时加载几个单独的实例后,此方法可能会导致内存问题。