0

У меня относительно распространенная настройка TabBarController, вкладки которой содержат NavigationControllers, которые имеют TableViewControllers как свои корни. Я пытаюсь выполнить некоторую логику при инициализации одного из этих TableViewControllers, но, похоже, не может найти, какую функцию init вызывается.Инициализация для ViewController под NavController в TabBarController

Моя цель - добавить слушателя в TableViewController (который я получил подклассом), который может реагировать на события, обновив свойство navigationController.tabBarItem.badgeVluew.

Я попытался вставить код в initWithStyle: а также init, но ни один из них не получил вызов. Я также попытался поместить его в viewDidLoad, но это вызвано только после того, как контроллер фактически появится (мне нужно, чтобы это произошло, как только контроллер загрузился /, как только появится элемент панели табуляции).

Кто-нибудь знает, где я бы поставил этот код, чтобы он произошел при инициализации контроллера?

Кроме того, все это настроено через построитель интерфейсов/NIB. Я не добавляю контроллер nav или controlviewcontroller вручную, поэтому неясно, какую функцию инициализации мне нужно переопределить.

+0

Как вы инициализируете контроллеры табличного представления, когда добавляете их в стек UINavigationController? Кроме того, вы попробовали viewWillLoad:? –

+0

Контроллер таблицы не инициализирован мной. Все подключено в IB, где я указываю контроллеру панели вкладок, что «Tab1» будет NavigationController и загрузит его представление из «MyView» (отдельный файл NIB). Помещение его в viewWillLoad не сработало либо к сожалению (я предполагаю, что это вызвано непосредственно перед вызовом viewDidLoad) –

ответ

1

Если вы выберете один из ваших UITabBarItems в IB, вы увидите «Просмотр загружен из« YourView ». Нажмите на этот «серый» вид. В окне «Инспектор» вы увидите вкладку «Атрибуты» (вкладка слева) название и имя NIB, которое будет загружено (позволяет называть его «YourNibName»).

Теперь выберите нужную вкладку инспектора (Identity) и измените имя класса (Combo рядом с классом) на свой класс «YourViewController», который вы должны создать в xcode. Не используйте стандартный ViewController, который уже выбран. InterfaceBuilder загружает ваш наконечник и прикрепляет его к вашему ViewController.

Откройте ваше имяNNNName и измените класс FileOwner (инспектор, правая вкладка) на «YourViewController».

В вашей NIB-панели TabBar также есть FilesOwner. Создание ViewController для этого FilesOwner и установить его класс в этом контроллере (т.е. TabBarController)

В «TabBarController» вы можете узнать, какие Tab был выбран с помощью этого кода:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 

if ([viewController.nibName isEqualToString:@"NIBName1"]){ 

    // Do something here, if you like. (i.e. Save the state in a string or int) 
} 

if ([viewController.nibName isEqualToString:@"NIBNAme2"]){ 

    // Do something here, if you like. (i.e. Save the state in a string or int) 
} 

... 
} 

Здесь вы можете сделать что-то «глобально» или пренициализировать что-то. Это ОДНА вещь, которую вы можете сделать.

INIT ВАШИХ МНЕНИЙ:

При выборе вкладки и вид (который обрабатывается YourViewController) будут показаны впервые, «viewDidLoad» будет называться в «YourViewController»

- (void)viewDidLoad { 

// Here you can add views programatically 
[self.view addSubview:myNavigationController.view]; 
[self.view bringSubviewToFront:myNavigationController.view]; 

    // And if you like, do some INIT here 


[super viewDidLoad]; 

} 

Надеюсь, это ваш вопрос.

Теперь что-то о значке. Это взломать, но отлично работает для меня.

Заголовок файла:

Добавить выход к контроллеру, который, представляющий ваш TabBarController:

@interface yourController : UIViewController <UITabBarControllerDelegate> { 

    UITabBarController *tabBarController; 
} 

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; 

@end 

Подключите этот выход в IB с TabBar.

Реализация:

В вашем TabBarControllerClass вы можете перезаписать 'initWithNibName':

@synthesize tabBarController; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 

     // Do some init here 

     // select your desired item (it will be loaded) 
     // then you can assign the badge 
     tabBarController.selectedIndex = 1; 
    tabBarController.selectedViewController.tabBarItem.badgeValue = @"222"; 

      // and select the item you will start with 
    tabBarController.selectedIndex = 0; 

// if you like you can add a notification, which you can activate from anywhere else 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(itemBadgeChanged:) 
              name:@"itemBadgeChangedNotification" 
              object:nil]; 
} 
    return self; 
} 

, если вы не используете перо, используйте '- (Недействительными) loadView {...}' вместо этого. Вы используете подкласс контроллера TabBar, возможно, вы можете использовать 'self.selectedIndex = 1;' вместо 'tabBarController.selectedIndex = 1;' и т. д. Попробуйте это

Надеюсь, это поможет!

+1

У меня уже есть контроллер, загруженный контроллером view/tabbar, связанным с соответствующим подклассом UITableViewController, но спасибо за объяснение. Реальная проблема в том, что мне нужно запустить логику * до того, как * контроллер будет выбран (в основном, как только его функция инициализации вызывается). tabBarController: didSelectViewController: и viewDidLoad вызывается только при первом переходе на эту вкладку. Я хочу поместить логику в подкласс класса viewcontroller, который запускается, когда он создан, даже до того, как он будет показан. –

+0

@ Chris R. Привет, я думаю, что сейчас понимаю ваш вопрос. Я вложил код в ответ. Возможно, это работает на вас. – JackPearse

Смежные вопросы