Цель-C: Tabbaritem постучал-> Метод вызван-> Но WebView не обновлен - PullRequest
0 голосов
/ 13 сентября 2018

Пытаясь достичь

Когда я нажимаю на tabbaritem скажем # 2, он вызывает метод и перезагружает веб-представление.

Выпуск

Когда я нажимаю на tabbaritem, метод вызывается, но веб-представление не перезагружается.

Не загружено веб-представление

Вопрос

Если бы я вызвал метод на самом VC. Я могу перезагрузить веб-представление. Только если я вызвал его при нажатии на tabbaritem, он не перезагружает веб-представление.

код

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];

}

1 Ответ

0 голосов
/ 13 сентября 2018

Как я уже упоминал в моем другом ответе Objective-C: как правильно установить метод didSelectViewController для TabBarController, чтобы я мог обновлять VC каждый раз, когда он подключается , я не думаю, что это хороший пользовательский опыт дляобновлять представление с сервера каждый раз, когда выбирается панель вкладок (это будет очень раздражать, когда пользователи будут ждать каждый раз, когда сервер обновит данные)

Как говорится, проблема с кодом, который выопубликовано то, что вы инициализируете новый экземпляр ваших классов в методе TabBarControllerDelegate, поэтому метод будет вызываться для этого нового экземпляра, а не для того, который отображается / существует в контроллерах представления вашего TabBarController.В частности, эти две строки инициализируют новые экземпляры:

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

Вместо этого вы должны найти экземпляр, который уже существует, и вызвать для них метод.

Я бы порекомендовал создать ParentViewController с публичным методом в соответствии с - (void)doStuffWhenTabBarControllerSelects; (просто пример именования, чтобы было понятно, что он делает с вами), затем пусть каждый из контроллеров представления, которые вы хотели бы иметь, делает что-то, когда они выбраны, как дочерние классы этогоparent (и имеют собственную реализацию - (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), которая содержит множество полезной информации.

...