目标C - 再次点击标签栏项目时,如何再次重新加载网页视图?

Posted

技术标签:

【中文标题】目标C - 再次点击标签栏项目时,如何再次重新加载网页视图?【英文标题】:Objective C - When tapping the tab bar item again, how to reload web view again? 【发布时间】:2018-09-04 07:18:00 【问题描述】:

我真的需要帮助。最初,通过点击标签栏项目,我将在Gym VC 上加载webview,然后用户将向下滚动web view 我想要完成的是当用户再次点击相同的标签栏项目时,webView 将再次重新加载。我设法从MyTabBarController 调用方法handleRefresh 但该方法根本没有做任何事情。非常感谢任何指导。

目前我有以下代码

MyTabBarController.m

#import "GymNavigationController.h"
#import "Gym.h"

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

    if([viewController isKindOfClass:[GymNavigationController class]])

        Gym *myGym = [[Gym alloc] init];
        [myGym handleRefresh:nil];
     

健身房.m

#import "Gym.h"
#import "AppDelegate.h"
#import "GymDet.h"
#import <QuartzCore/QuartzCore.h>

@interface Gym () 

AppDelegate *appDelegate;
NSString *sURL, *sRefresh; 



@end

@implementation Gym

@synthesize webView;

- (void)viewDidLoad 

    [super viewDidLoad];

    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    sURL = appDelegate.gURL;
    sURL = [sURL stringByAppendingString:@"/apps/gym.asp?"];

    NSLog(@" The sURL to be load for the current page : %@ ", sURL);

    sRefresh = sURL;

    [defaults setObject:sRefresh forKey:@"txtRefresh"];
    [defaults synchronize];

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

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
    [webView.scrollView addSubview:refreshControl];



- (void) viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

    //[self handleRefresh:nil];

    [[self navigationController] setNavigationBarHidden:YES animated:YES];


-(void)viewDidDisappear:(BOOL)animated

    [[self navigationController] setNavigationBarHidden:NO animated:YES];


- (void)handleRefresh:(UIRefreshControl *)refresh 

    //--- Call the stored txtMemCode, something like session ---
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    sRefresh = [defaults objectForKey:@"txtRefresh"];

    NSURL *url = [NSURL URLWithString:sRefresh];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    [webView loadRequest:urlRequest];
    [refresh endRefreshing];

【问题讨论】:

注意:不要打电话给-[NSUSerDefaults synchronize]。来自Apple's documentation... “这个方法是不必要的,不应该使用。” 【参考方案1】:

首先,我想建议您为什么每次点击标签栏时都会启动一个新的 Gym 对象,您应该获取 Gym 对象的引用并在其为 nil 时对其进行初始化,然后使用引用进行处理,但这可能是您的要求如果是,我想建议您创建一个 BOOL 变量,让我们说 isUpdateRequire 并且当您实例化您的视图控制器时分配 isUpdateRequire = true。然后在视图的末尾确实加载或视图会出现(根据您的需要)检查

if isUpdateRequire 
    [self handleRefresh:nil]

或者,您可以在 webviewcontroller 中创建协议并将其委托分配给您的 tabbarcontroller,并在需要时触发委托方法。

如果您不想在返回 vc 时调用该方法,只需将此条件放在 viewWillAppear 中

if self.isMovingToParentViewController  
    [self handleRefresh:nil] 

【讨论】:

对不起,我是个菜鸟,请您详细说明一下 好的,你想知道什么? 实际上我试图阻止Gym Detail 的后退按钮重新加载Gym 页面。我希望用户回到他们在Gym 页面滚动的位置。那么如何真正防止调用viewDidAppear 我也在尝试在再次点击标签栏项目以再次刷新webview 时重新加载页面。 好吧,那你为什么不在viewwillappear中调用handleRefresh方法呢? 是的,它适用于第一个,因为它在 viewDidLoad 处加载

以上是关于目标C - 再次点击标签栏项目时,如何再次重新加载网页视图?的主要内容,如果未能解决你的问题,请参考以下文章

Objective C - WebView无法从顶部重新加载

再次点击当前标签栏时如何在 UITableView 中滚动到顶部?

如何停止加载标签栏项目选择的视图?

再次恢复应用程序时如何不重新加载webview?

当我点击同一个标签栏控制器时如何打开同一个页面

如何在swift 3中从标签栏移动时重新加载页面?