ObjectiveC-WebView不能从顶部重新加载

时间:2018-08-30 09:03:37

标签: ios objective-c uiwebview uirefreshcontrol

我有一个webpage,其中包含很长的项目列表。我希望用户在标签栏项上点击时刷新页面。当他们点击选项卡栏项时,我设法调用该方法以加载Web视图。但是它只是不会从顶部重新加载。似乎webview正在从其位置或缓存或其他内容加载。我尝试removecahce,但似乎不起作用。我希望它重新从顶部重新加载。我无法使用viewWillAppear,因为当页面从detail返回时,我不希望页面重新加载。我还希望在点击选项卡栏项时重新加载页面。

在您浏览的地方重新加载,我需要从顶部一直重新加载。

Long list

MyTabBarController.m

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if([viewController isKindOfClass:[ClassNavigationController class]]) {
        Classes *myClasses = [[Classes alloc] init];
        [myClasses reloadWebView];
    }
}

Classes.m

- (void)LoadClasses {
    sURL = @"www.longlist.com"

    NSURL *url = [NSURL URLWithString:sURL];
    sRefresh = sURL;
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    [webView loadRequest:urlRequest];
    [webView setDelegate:(id<UIWebViewDelegate>)self];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
    [webView.scrollView addSubview:refreshControl];
}
//=== Not Working
-(void)reloadWebView{
    [webView reload];
}

2 个答案:

答案 0 :(得分:0)

您可以通过在加载时将其内容设置为CGPointZero来将webView滚动到顶部。

代码如下:

[webview.scrollView setContentInset:CGPointMake(0, 0)];

答案 1 :(得分:0)

可以在代理协议的帮助下满足您的需求。

首先通过Docs!可以更好地理解该概念。

现在,将代码转到您的 MyTabBarController.h 文件,并添加以下代码。

@protocol reloadWeb<NSObject>  // The reloadWeb is our protocol and can be named as you like
-(void)reloadWebViewData;    // This is the method to be called on the location you want the reload function to be called
@end

@interface MyTabBarController : UITabBarController

@property(nonatomic,assign)id<reloadWeb> reloadDelegate; // Here we create an object for the protocol.

然后在 MyTabBarController.m 上,并更新如下的didSelectViewController方法

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[newViewController class]]) { // Here newViewController is the controller where the webview reload happens.
        [[[newViewController alloc] init] reloadWebViewData];  // We create and instance for the new controller and call the delegate method where the reload works.
    }
}

现在 newViewController.h

#import "MyTabBarController.h"

@interface newViewController : UIViewController<reloadWeb>  // Here we have to confirm the protocol "reloadWeb" we created in order to access the delegate method

@end

最后在 newViewController.m

#import "newViewController.h"
#import "MyTabBarController.h"

@interface newViewController ()

@end

@implementation newViewController

- (void)viewDidLoad {
    [super viewDidLoad];

/*We have to assgin delegate to tab controller where protocol is defined so from there the "reloadWebViewData" method can be called*/
    MyTabBarController * tab = [[MyTabBarController alloc] init];
    tab.reloadDelegate = self;    

}

-(void)reloadWebViewData{ 
    NSLog(@"Reload Webview Data here ");
}
  

如果您错过添加上述方法(“ reloadWebViewData ”),由于缺少委托方法,Xcode将显示警告以确认协议“ reloadWeb”。

干杯!