Инициализация для ViewController под NavController в TabBarController - PullRequest
0 голосов
/ 26 октября 2010

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

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

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

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

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

1 Ответ

1 голос
/ 26 октября 2010

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

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

Откройте YourNibName и измените класс FilesOwner (инспектор, правая вкладка) на "YourViewController".

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

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

- (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)
}

...
}

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

НАЧАЛО ВАШИХ МНЕНИЙ:

Если вы выберете вкладку и представление (которое обрабатывается 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;
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...