Таким образом, TabBarController может иметь только одного делегата за раз. В опубликованном вами коде вы устанавливаете tabBarController.delegate = self в каждом соответствующем методе жизненного цикла контроллеров viewDidLoad (вызывается один раз при первой загрузке представления). Таким образом, независимо от того, что будет загружен последний контроллер представления, будет заключительной tabBarControllerDelegate.
Вот очень простой пример, чтобы показать, что я имею в виду:
FirstViewController
#import "FirstViewController.h"
@interface FirstViewController () <UITabBarControllerDelegate>
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tabBarController.delegate = self;
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"Who's my tab bar controller delegate = %@", self.tabBarController.delegate);
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
NSLog(@"Delegate called on %@", NSStringFromClass([self class]));
}
@end
SecondViewController
#import "SecondViewController.h"
@interface SecondViewController () <UITabBarControllerDelegate>
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tabBarController.delegate = self;
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"Who's my tab bar controller delegate = %@", self.tabBarController.delegate);
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
NSLog(@"Delegate called on %@", NSStringFromClass([self class]));
}
@end
Если я запустлю это и начну с выбора вкладки FirstViewController, затем перейдите на вкладку SecondViewController, а затем вернитесь к выбору вкладки FirstViewController. Это результат журнала, который я получаю:
First Tab Selected:
Who's my tab bar controller delegate = <FirstViewController: 0x7ff9eb406970>
Delegate called on FirstViewController
Second Tab Selected:
Who's my tab bar controller delegate = <SecondViewController: 0x7fa33ac0a540>
Delegate called on FirstViewController (this is still FirstViewController here because the tab bar selection occurred prior to setting the SecondViewController to the tabBarControllerDelegate)
First Tab Selected:
Who's my tab bar controller delegate = <SecondViewController: 0x7fa33ac0a540>
Delegate called on SecondViewController
Second Tab Selected:
Who's my tab bar controller delegate = <SecondViewController: 0x7fa33ac0a540>
Delegate called on SecondViewController
...
and it continues on that the SecondViewController will remain the delegate
Поэтому я рекомендую использовать другой шаблон, который просто поддерживает один координатор для обработки TabBarDelegation.
Изменить в ответ на ваш комментарий о других рекомендациях
Довольно стандартная идиома в iOS - однажды загрузить данные с сервера (обычно в viewDidLoad соответствующих контроллеров представления, а затем сохранить его), а затем использовать элемент управления pull для обновления, который позволяет пользователям обновлять данные по команде: https://medium.com/ios-os-x-development/ios-tips-pull-to-refresh-in-less-than-30-seconds-ef884520f0df Если вам определенно требуется, чтобы делегат панели вкладок что-то делал при каждом выборе контроллера представления, я бы порекомендовал иметь один центральный объект, который является единственным делегатом панели вкладок, и он обрабатывал, какие задачи выполнять на основе переданного контроллера представления. через метод делегата tabBarController:didSelectViewController:
в качестве одного дополнительного примера.