2009-10-27 1 views
3

В настоящее время у меня есть приложение iPhone с вкладкой и несколькими контрольными точками. Все представления разработаны в Interface Builder. Я хотел бы получить текущий выбранный указатель на панели управления viewcontroller, но по какой-либо причине это свойство возвращает (null).Получение выбранногоIndex текущей вкладки от viewcontroller

я назвал следующее в функции viewDidLoad моего ViewController:

self.tabBarController.selectedIndex

Что бы правильный способ сделать это?

Обновлен кодом класса AppDelegate.

MyAppDelegate.h

#import <UIKit/UIKit.h> 

@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 
    UIWindow *window; 
    UITabBarController *tabBarController; 
} 

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

@end 

MyAppDelegate.m:

#import "MyAppDelegate.h" 

@implementation MyAppDelegate 

@synthesize window, tabBarController; 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    [window addSubview:tabBarController.view]; 
} 

- (void)dealloc { 
    [tabBarController release]; 
    [window release]; 
    [super dealloc]; 
} 

@end 
+0

Каково значение tabBarController, а если нет, то какой класс он указывает. – zaph

+0

Надеюсь, я правильно понимаю, что вы имеете в виду. Я довольно новичок, что должно быть очевидно из моего первоначального вопроса. В любом случае, [self.tabBarController class] возвращает UITabBarController, чего следует ожидать, правильно? – mensch

ответ

4

Вы должны иметь указатель на ваш TabBar в классе AppDelegate. В вашем представлении нет вкладки, поэтому вы получаете нуль из [self.tabBarController selectedIndex].

+0

Как я могу это сделать? В классе есть указатель на tabBarController. Я обновляю вопрос с помощью кода класса appDelegate. – mensch

+1

myAppDelegate * getAppDelegate() { \t return (myAppDelegate *) [UAppication sharedApplication] .delegate; }} Вы можете добавить этот метод в класс appdelegate и вызвать свою вкладку getAppDelegate(). TabBarController – Morion

+0

Это то же самое, что и: MyAppDelegate * appDelegate = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; NSLog (@ "% @", appDelegate.tabBarController.selectedIndex); Боюсь, что это также возвращает (null). И приложение сбой при переключении на другую вкладку – mensch

0

Я думаю, что у меня это есть. Использование следующих возвращает правильный индекс:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSLog(@"%d", appDelegate.tabBarController.selectedIndex); 

Причина заявка была врезаться заключалась в том, что я использовал% @ вместо% D в части NSLog. Я мог бы поклясться, что пробовал% d раньше, странно ...

Индекс теперь возвращается, но только один раз. После того, как вы коснетесь раздела вкладки, возвращается номер индекса, но когда вы снова нажимаете на другой раздел, число не печатается. Вероятно, потому что представление уже загружено один раз. Есть ли способ обойти это?

+1

Использовать другой метод? viewDidLoad - это обратный вызов, который система использует, чтобы сообщить контроллеру своего представления, что его представление только что загружено (будь то файл nib или код в loadView или что-то еще). Его можно назвать несколько раз в течение всего срока службы контроллера, но только в том случае, если представление было выгружено в какой-то момент между ними (например, с помощью предупреждения с низкой памятью). Возможно, вы ищете что-то вроде viewWillAppear:? –

+0

Кроме того, такое разъяснение действительно должно быть редактированием вопроса, а не ответом. –

+0

Извините, я сейчас отредактирую корень вопроса в будущем. Спасибо за указатель viewDidLoad, рассмотрим это. – mensch