Objective-C:Tabbaritem tapped-> Method Called->但WebView没有刷新

问题描述 投票:0回答:1

Trying to achieve

当我点击tabbaritem说#2时,它将调用该方法并重新加载Web视图。

Issue

当我点击tabbaritem时,会调用该方法,但不会重新加载Web视图。

Did not load the web view

Question

如果我在VC本身调用该方法。我可以设法重新加载Web视图。只有在点击tabbaritem时我才调用它,它才会重新加载Web视图。

Code

MyTabBarController.m

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

    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);

        if (viewController == [tabBarController.viewControllers objectAtIndex:2])
         {
        [(UINavigationController *)viewController popToRootViewControllerAnimated:YES];
        tabBarController.delegate = self;
         [[[Classes alloc] init] LoadClasses];

    }else if (viewController == [tabBarController.viewControllers objectAtIndex:3]){

        [(UINavigationController *)viewController popToRootViewControllerAnimated:YES];
        tabBarController.moreNavigationController.delegate = self;
        [[[Gym alloc] init] handleRefreshGym:nil];

}else{
        [(UINavigationController *)viewController popToRootViewControllerAnimated:NO];
    }

}

Classes.m

- (void)LoadClasses {

    sURL = @"www.share-fitness.com/apps/class.asp?memCode=SF100012&dtpClass=13/09/2018&lang=EN&lat=37.785835&long=-122.406418&ver=1&plat=IOS"

    NSLog(@"The URL To be loaded %@", sURL);

    NSURL *url = [NSURL URLWithString:sURL];
    sRefresh = sURL;
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    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];

}
objective-c uitabbarcontroller uitabbar uitabbaritem
1个回答
3
投票

正如我在其他回复Objective-C: How to properly set didSelectViewController method for TabBarController, so I can refresh the VC everytime it is tapped中提到的,我不认为每次选择标签栏时都要从服务器刷新视图是很好的用户体验(这会让用户每次等待服务器刷新都会很烦人数据)

话虽如此,您发布的代码的问题是您正在TabBarControllerDelegate方法中初始化类的新实例,因此将在此新实例上调用该方法,而不是在TabBarController视图中显示/存在的实例上调用该方法控制器。特别是这两行正在初始化新实例:

[[[Classes alloc] init] LoadClasses];
[[[Gym alloc] init] handleRefreshGym:nil];

相反,您应该找到已存在的实例,并在其上调用该方法。

我建议使用ParentViewController的公共方法创建一个- (void)doStuffWhenTabBarControllerSelects;(只是示例命名以清楚它对你做了什么)然后让每个视图控制器在你被选中时做你想做的事情。这个父类的类(并有自己的- (void)doStuffWhenTabBarControllerSelects;实现)。这样在TabBarController的委托方法中,您可以找到适当的ParentViewController实例(与正在选择的视图控制器相关联)并在其上调用- (void)doStuffWhenTabBarControllerSelects;方法。

这是我的意思的一个例子:

ParentViewController.h:

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface ParentViewController : UIViewController
- (void)doStuffWhenTabBarControllerSelects;
@end

NS_ASSUME_NONNULL_END

ParentViewController.m:

#import "ParentViewController.h"

@interface ParentViewController ()

@end

@implementation ParentViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)doStuffWhenTabBarControllerSelects {
    NSLog(@"Fallback implementation if this method isn't implemented by the child class");
}

@end

FirstViewController.h:

#import <UIKit/UIKit.h>
#import "ParentViewController.h"

@interface FirstViewController : ParentViewController


@end

FirstViewController.m:

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

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

- (void)doStuffWhenTabBarControllerSelects {
    NSLog(@"I'm doing stuff on the %@ when the tab bar controller delegate calls back to selection", NSStringFromClass([self class]));
}


@end

SecondViewController.h:

#import <UIKit/UIKit.h>
#import "ParentViewController.h"

@interface SecondViewController : ParentViewController


@end

SecondViewController.m:

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

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

- (void)doStuffWhenTabBarControllerSelects {
    NSLog(@"I'm doing stuff on the %@ when the tab bar controller delegate calls back to selection", NSStringFromClass([self class]));
}

@end

MyTabBarController.h:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MyTabBarController : UITabBarController <UITabBarControllerDelegate>

@end

NS_ASSUME_NONNULL_END

MyTabBarController.m:

#import "MyTabBarController.h"
#import "ParentViewController.h"

@implementation MyTabBarController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.delegate = self;
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    // since your view controllers are embedded in nav controllers, let's make sure we're getting a nav controller
    if ([viewController isKindOfClass:[UINavigationController class]]) {
        // we're expecting a nav controller so cast it to a nav here
        UINavigationController *navController = (UINavigationController *)viewController;
        // now grab the first view controller from that nav controller
        UIViewController *firstViewControllerInNav = navController.viewControllers.firstObject;
        // check to make sure it's what we're expecting (ParentViewController)
        if ([firstViewControllerInNav isKindOfClass:[ParentViewController class]]) {
            // cast it to our parent view controller class
            ParentViewController *viewControllerToCallMethodOnAfterSelection = (ParentViewController *)firstViewControllerInNav;
            [viewControllerToCallMethodOnAfterSelection doStuffWhenTabBarControllerSelects];
        }
    }
}

@end

然后,当您在两个选项卡之间进行选择时,这将是输出:

I'm doing stuff on the FirstViewController when the tab bar controller delegate calls back to selection

I'm doing stuff on the SecondViewController when the tab bar controller delegate calls back to selection

我建议做一些额外的研究/阅读文档:

这里有很多初学者信息:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/DefiningClasses/DefiningClasses.html#//apple_ref/doc/uid/TP40011210-CH3-SW1

UITabBarController:https://developer.apple.com/documentation/uikit/uitabbarcontroller?language=objc

UITabBarControllerDelegate:https://developer.apple.com/documentation/uikit/uitabbarcontrollerdelegate?language=objc

另一个有用的提示是,在Xcode中,您可以按住选项键并单击某些内容以快速查看说明/文档

Documentation Quick Look

您也可以右键单击某些内容并“跳转到定义”。 Apple的大多数实现都将在标题中包含其他信息。

这是UITabBarController标题中的示例:

/*!
 UITabBarController manages a button bar and transition view, for an application with multiple top-level modes.

 To use in your application, add its view to the view hierarchy, then add top-level view controllers in order.
 Most clients will not need to subclass UITabBarController.

 If more than five view controllers are added to a tab bar controller, only the first four will display.
 The rest will be accessible under an automatically generated More item.

 UITabBarController is rotatable if all of its view controllers are rotatable.
 */

NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewController <UITabBarDelegate, NSCoding>

在“帮助”菜单下,还有“开发人员文档”(CMD + SHIFT + 0),其中包含大量有用信息。

© www.soinside.com 2019 - 2024. All rights reserved.