Objective-C: Tabbaritem нажат- ›Метод вызван-› Но WebView не обновляется

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

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

Проблема

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

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

Вопрос

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

Код

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

}

Классы.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];

}

person Hanz Cheah    schedule 13.09.2018    source источник


Ответы (1)


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

При этом проблема с опубликованным вами кодом заключается в том, что вы инициализируете новый экземпляр своих классов в методе 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 вы можете удерживать клавишу выбора и щелкнуть что-нибудь, чтобы быстро просмотреть объяснение / документацию.

Краткий обзор документации

Вы также можете щелкнуть что-нибудь правой кнопкой мыши и «Перейти к определению». В заголовке большинства реализаций 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), в которой есть множество полезной информации.

person R4N    schedule 13.09.2018