Как я уже упоминал в моем другом ответе 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](https://i.stack.imgur.com/ag2KF.png)
Вы также можете щелкнуть правой кнопкой мыши по чему-нибудь и «Перейти к определению».Большинство реализаций 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), которая содержит множество полезной информации.