2009-10-27 2 views
3

현재 탭바와 다중 뷰 콘트롤러가있는 iPhone 애플리케이션이 있습니다. 모든 뷰는 Interface Builder에서 설계되었습니다. viewcontroller에서 tabbar의 현재 선택된 인덱스를 가져올 수 있기를 원하지만 어떤 이유로이 속성이 null을 반환합니다.현재 뷰 콘트롤러에서 선택된 탭의 selectedIndex 얻기

self.tabBarController.selectedIndex

어떻게이 작업을 수행하는 올바른 방법이 될 것이다 :

나는 내의 ViewController의 viewDidLoad에 기능에 다음이라고?

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

당신은 AppDelegate에 클래스에 TabBar의 포인터를해야한다. 뷰에는 탭이 없으므로 [self.tabBarController selectedIndex]에서 nil을 수신합니다.

+0

어떻게하면됩니까? 클래스에는 tabBarController에 대한 포인터가 있습니다. 질문을 appDelegate 클래스의 코드로 업데이트했습니다. – mensch

+1

myAppDelegate * getAppDelegate() { \t return (myAppDelegate *) [UIApplication sharedApplication] .delegate; } 당신은 당신의 AppDelegate에 클래스에이 방법을 추가하고 getAppDelegate하여 TabBar의()를 호출 – Morion

+0

tabBarController이이 같은과 같습니다. MyAppDelegate * AppDelegate에 = (MyAppDelegate *) [[UIApplication sharedApplication] 위임] NSLog (@ "% @", appDelegate.tabBarController.selectedIndex); 이것도 (null)을 반환하기 때문에, 나는 두렵다. 그리고 다른 탭 섹션 – mensch

0

나는 그것을 얻었습니다. 다음 반환에게 올바른 인덱스를 사용 : 응용 프로그램이 충돌했다

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

이유는 내가 NSLog 부분에 %의 @ 대신 % d 개를 사용한다는 사실이었다. 나는 전에 이상한, % d를 시도했다고 맹세 할 수 있었다 ...

인덱스가 반환되었지만 한 번만. 탭 섹션을 누르면 색인 번호가 반환되지만 다른 섹션을 다시 누르면 아무 번호도 인쇄되지 않습니다. 뷰가 이미 한 번로드 되었기 때문일 수 있습니다. 이 문제를 해결할 수있는 방법이 있습니까?

+1

다른 방법을 사용 하시겠습니까? viewDidLoad는 뷰 컨트롤러에 뷰가 방금로드되었는지 (nib 파일 또는 loadView의 코드 등)에 관계없이 시스템이 사용하는 콜백입니다. 컨트롤러의 수명 동안 여러 번 호출 될 수 있지만보기가 언로드 된 경우 (예 : 메모리 부족 경고)에만 가능합니다. 아마도 당신은 viewWillAppear와 같은 것을 찾고 있습니다 :? –

+0

또한이 종류의 설명은 실제로 대답이 아닌 질문에 대한 편집 일 것입니다. –

+0

죄송합니다. 앞으로부터 루트 질문을 편집하겠습니다. viewDidLoad 포인터를 주셔서 감사합니다. – mensch