2011-12-26 3 views
-3

iOS 4.x/5.0 용 첫 번째 iPhone 앱을 개발 중이며 권장 Apple 가이드 라인을 준수하는 방법에 대한 약간의 혼란이 있습니다. 또한 코드 스 니펫을 첨부했습니다. iOS 5 초보자 - iPhone 앱 개발에 도움이 필요합니다.

응용 프로그램로드, 나는 화면 하단에 다음과 같은 기능을 보여주고 싶은

: 테스트 설정 여기

는 시나리오입니다. 내 첫 번째 질문은 UISegmentedControl 또는 UITabBar 함께 가야합니까? 가장 까다로운 부분은 첫 번째 "테스트"탭/버튼이 자동으로 선택되기를 원하지 않는다는 것입니다. 사용자가 탭/버튼을 선택하길 원합니다. 그 때까지는 일부 텍스트를 보여주는 타이머가 필요합니다. UITabBar를 사용하려고 시도하고 앱이로드되면 첫 번째 '테스트'탭이 선택되고 연결된 ViewController가 기본적으로 표시됩니다. AppDelegate.m의 "didFinishLaunchingWithOptions"메서드에서 "루트보기 컨트롤러"를 눌러이 문제를 피할 수있었습니다. 이것은 작동하고 "점수"탭을 클릭하면 "루트보기 컨트롤러"가 팝업되고 "테스트보기 컨트롤러"가 푸시됩니다. 하지만 응용 프로그램이로드 된 후 "설정"탭을 선택하고 "테스트"탭을 클릭하면 "테스트"탭의보기 컨트롤러가 전혀로드되지 않지만 "기본보기 컨트롤러"는 계속 표시됩니다. 또한 "테스트"탭에 UINavigationController가 있으며 "viewDidAppear"이벤트에서이를 숨 깁니다. 또한 "Test"탭을 클릭했을 때 애니메이션 (뒤로 밀기)을 제거하고 싶습니다.

내 혼란은 다음과 같습니다

  1. 내가 때 "테스트 뷰 컨트롤러 (상단에 표시)에"시작/정지 "버튼을 사용자가 클릭 수 있도록 다른 컨트롤로 UINavigationController가를 대체 할 수 "?

  2. 각 탭에 대해 UITabBar의 탭에 클릭 이벤트가 있습니까?

  3. 코드에서부터 컨트롤 추가를 제외한 모든 것을 ViewController에 적용하고 싶었습니다. 동일한 일을하기 위해 IB를 사용하는 것이 혼란스럽게 보입니다. 이것은 나쁜 접근입니까?

    AppDelegate.m

    #import "NavTabTestAppDelegate.h" 
    #import "RootViewController.h" 
    #import "FirstViewController.h" 
    #import "SecondViewController.h" 
    
    @implementation NavTabTestAppDelegate 
    
    @synthesize window = _window; 
    
    - (BOOL)application:(UIApplication *)application   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
    
    RootViewController *rootViewController = [[RootViewController alloc ] initWithNibName:@"RootViewController" bundle: nil]; 
    [rootViewController.view setBackgroundColor:[UIColor blueColor]]; 
    // [rootViewController setTitle:@"RootViewController"]; 
    
    FirstViewController *firstViewController = [[FirstViewController alloc ] initWithNibName:@"FirstViewController" bundle: nil]; 
    [firstViewController.view setBackgroundColor:[UIColor yellowColor]]; 
    [firstViewController setTitle:@"FirstViewController"]; 
    
    SecondViewController *secondViewController = [[SecondViewController alloc ] initWithNibName:@"SecondViewController" bundle: nil]; 
    [secondViewController.view setBackgroundColor:[UIColor redColor]]; 
    [secondViewController setTitle:@"SecondViewController"]; 
    
    //create the navigation controller and use NavRootController as its root 
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:firstViewController]; 
    
    //create an array of views that will be passed to our tabbar 
    NSArray *viewsArray = [NSArray arrayWithObjects:nav, secondViewController, nil]; 
    
    //Now create our tab bar controller 
    UITabBarController *tabbarController = [[UITabBarController alloc] init]; 
    
    //then tell the tabbarcontroller to use our array of views 
    [tabbarController setViewControllers:viewsArray]; 
    
    [nav pushViewController:rootViewController animated:NO]; 
    
    
    //nav.view.hidden = YES; 
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    
    
    //then the last step is to add the our tabbarcontroller as subview of the window 
    self.window.rootViewController = tabbarController; 
    
    return YES; 
    } 
    

    RootViewController.m (다음의 코드를 추가)

    - (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:animated]; 
    // NSLog(@"Inside RootViewController.m viewWillAppear %@", animated); 
    } 
    
    - (void) viewWillDisappear:(BOOL)animated{ 
    // NSLog(@"Inside RootViewController.m viewWillDisappear %@", "Done"); 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:NO animated:NO]; 
    
    } 
    

    FirstViewController.m합니다 (추가 :

다음 코드 조각이며 다음 코드는 애니메이션을 방지하지만 작동하지 않음)

- (void) viewWillAppear:(BOOL)animated { 
[super viewWillAppear:NO]; 
[self.navigationController setNavigationBarHidden:NO animated:NO]; 
// NSLog(@"Inside FirstViewController.m viewWillAppear %@", animated); 
} 

- (void) viewWillDisappear:(BOOL)animated{ 
//  NSLog(@"Inside FirstViewController.m viewWillDisappear %@", "Done"); 
[super viewWillAppear:NO]; 
[self.navigationController setNavigationBarHidden:NO animated:NO]; 

} 

탭 (BAD_ACCESS)을 클릭하면 NSLogs가 예외를 throw합니다. 이유를 알아낼 수 없었습니다.

저는 Windows 개발자 배경에서 왔으며 오랫동안 사과드립니다. 도와주세요.

감사합니다.

+1

이 질문을 이해하기 쉽도록 많이 만들 수 있습니다. 포함 된 코드는 전혀 도움이되지 않으며 중간에 매우 조밀하고 혼란스러운 단락이 있습니다. 귀하가 정말로 알고 자하는 것에 대한 기본 사항으로 질문을 추출하십시오. – Caleb

답변

1

첫 번째 질문은 UISegmentedControl 또는 UITabBar와 함께해야합니까? 가장 까다로운 부분은 첫 번째 "테스트" 탭/버튼을 자동으로 선택하지 않기를 바랍니다.

나는 UITabBarController의 요점을 놓치고 있다고 생각합니다. 이 작업은 사용자가 여러 가지보기 중 하나를 선택하게하고보기에 해당하는보기 컨트롤러를 관리합니다. 보기 중 하나가 항상 선택됩니다. 탭을 선택하지 않은 것은 실제로 의미가 없습니다. "탭"이보기를 선택하는 것 이외의 다른 작업을 수행하게하려면 UIToolbar 또는 UISegmentedControl과 같은 다른 것을 사용해야합니다.

나는 때 "테스트보기 컨트롤러"에서 (상단에 표시)에 "시작/정지"버튼을 사용자가 클릭을 할 몇 가지 다른 컨트롤로 UINavigationController가를 대체 할 수?

내비게이션 컨트롤러로 무엇을하려는지를 파악하는 데 어려움을 겪었으므로 교체 할 수 있는지 여부를 말하기가 어렵습니다. UINavigationController는 컨트롤이 아닌 뷰 컨트롤러임을 이해해야합니다. 네비게이션 컨트롤러가 제공하는 네비게이션 바에 대해서만 말한다면, 네가 원하는대로 네비게이션 바를 표시 할 수있다.

각 탭에 대해 UITabBar의 탭에 클릭 이벤트가 있습니까?

탭 모음 대리자는 – tabBarController:didSelectViewController:을 포함하는 UITabBarDelegate 프로토콜을 구현해야합니다.

나는 컨트롤 (컨트롤 추가 제외)부터 ViewControllers로 모든 것을하고 싶었습니다. IB를 사용하여 동일한 일을 혼란스럽게합니다. 이것은 나쁜 접근입니까?

귀하가 묻는 질문에 따라 다릅니다. 대부분의 경험 많은 Objective-C 프로그래머는 적절할 때, 즉 비교적 정적 인 사용자 인터페이스를 정의해야 할 때 언제든지 IB를 사용합니다.
어떤 사람들은 IB를 사용하지 않는 것을 좋아하지만, 대부분의 사람들은 IB 사용 방법을 배우는 데 시간을 정말로 투자하지 않았습니다. 당신은 당신이 선호하는 것을해야합니다.

저는 단기간에 합리적 일 수는 없으므로 유용한 도구를 피하는 것이 좋지만 장기적으로는 좋지 않은 접근이라고 말하고 싶습니다. 완전히 새로운 플랫폼에서 프로그래밍하는 법을 배우면, 알아야 할 사항의 수를 제한하는 것이 합리적입니다. IB는 실제로 복잡하지 않지만 매우 유용합니다. 지금 당장 사용하지 않는다면, 장래에 시간을 보내고 자 노력하십시오.

+0

답장을 보내 주셔서 감사합니다. 네가 한 말대로 해. 필요한 기능에 UITabBar를 사용할 수 있습니까? 동시에 (상태 표시 줄 옆에있는) UINavigationItem과 함께 UINavigationBar를 사용하십시오. 또한, 탭 중 하나에서 전체 화면에 상태 표시 줄을 숨기고 싶었습니다. 그것을하는 것이 합법적입니까? YouTube에서 동영상을 재생할 때 보았습니다. 회신 해주십시오. –

관련 문제