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

}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме