Как я уже упоминал в своем другом ответе, Цель -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