2013-02-08 3 views
2

오른쪽에 하나와 왼쪽에 하나씩 두 개의 barbutton 항목을 설정했습니다. 오른쪽보기는 두보기 사이에서 성공적으로 변경되고 두 번째보기는 현명한보기와 같이 두보기 사이에서 변경되어야하는 세그먼트 된 컨트롤입니다. 여기 내 코드입니다, 나는 어떻게 분할 된 컨트롤과 변화하는보기를 구현하는 방법을 알고 싶다.뷰를 변경하는 UISegmented 뷰

- (void)setupNavigationBar { 
    UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)]; 
    UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:@"ContainerView"]; 
    navItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:self action:@selector(switchViewControllers)]; 
    navBar.items = [NSArray arrayWithObject:navItem]; 
    segmented = [[UISegmentedControl alloc] initWithItems: 
            [NSArray arrayWithObjects: 
            [UIImage imageNamed:@"seg1.png"], 
            [UIImage imageNamed:@"seg1.png"], 
            nil]]; 
    segmented.frame = CGRectMake(0, 0, 50, 30); 

    segmented.segmentedControlStyle = UISegmentedControlStyleBar; 

    UIBarButtonItem * segmentedBarItem = [[UIBarButtonItem alloc] initWithCustomView:segmented]; 
    navItem.leftBarButtonItem = segmentedBarItem; 

    [self.view addSubview:navBar]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // This is just for the purpose of calling the switch method. 
    [self setupNavigationBar]; 

    CGRect rect = CGRectMake(0, 44, 320, 436); 

    currentViewController = [[FirstViewController alloc] init]; 
    currentViewController.view.frame = rect; 

    nextViewController = [[SecondViewController alloc] init]; 
    nextViewController.view.frame = rect; 

    [self addChildViewController:currentViewController]; 
    [self addChildViewController:nextViewController]; 

    [self.view addSubview:currentViewController.view]; 
} 

- (void)switchViewControllers { 
    [self transitionFromViewController:currentViewController toViewController:nextViewController duration:3.0 options:UIViewAnimationTransitionFlipFromRight | UIViewAnimationOptionCurveEaseInOut animations:nil completion:^(BOOL finished) { 
     UIViewController *tempViewController = currentViewController; 
     currentViewController = nextViewController; 
     nextViewController = tempViewController; 
     tempViewController = nil; 
    }]; 
} 

뷰를 변경하려면 어떻게 분할 컨트롤을 구현합니까?

+0

두 개의 하위보기가있는 viewController를 사용하지 않는 이유는 무엇입니까? 그런 다음 세그먼트 컨트롤을 사용하여 표시 할보기를 전환하십시오. 사용이 전환되면 애니메이션을 적용 할 수도 있습니다. 동일한 이론을 사용하여 UICollectionView와 UITableView를 전환합니다. – Patrick

+0

어디 세그먼트 컨트롤러에 wnat? – iPatel

+0

나는 그것을 효과적으로 수행하는 방법에 대해서는 알지 못했지만 –

답변

1

UISegmentedControl를 추가 할 경우 UINavigationBar

편집 :

NSArray *itemArray = [NSArray arrayWithObjects: 
         [UIImage imageNamed:@"1.png"], 
         [UIImage imageNamed:@"2.png"], 
         nil]; 

UISegmentedControl* menuSegmentedButton = [[UISegmentedControl alloc] initWithItems:itemArray]; 
menuSegmentedButton.momentary = YES; 
menuSegmentedButton.selected = NO; 
menuSegmentedButton.segmentedControlStyle = UISegmentedControlStyleBar; 
    [menuSegmentedButton addTarget:self action:@selector(doMenu) 
       forControlEvents:UIControlEventValueChanged]; 
[menuSegmentedButton sizeToFit]; 
UIBarButtonItem* barButton = [[UIBarButtonItem alloc] 
           initWithCustomView:menuSegmentedButton]; 
self.navigationItem.leftBarButtonItem = barButton; 

도청 세그먼트 버튼이 방법을 추가

-(void)doMenu 
{ 
    /// code for segment button tapped 
} 
+0

고맙습니다. @iPatel –

+0

세그먼팅 된 컨트롤에서 이미지가 필요하지 않았습니다./ –

+0

당신의 코드 덕분에 그것을 해결했습니다 –

1

I 성능 문제는 별도의 뷰 컨트롤러를 가지고 필요보다는 수 있습니다 추측 두 개의 하위보기가 있지만 훨씬 더 복잡합니다. cated 네비게이션 시스템과 각보기에 대한 세그먼트 컨트롤을 설정해야합니다. 보기를 서브 클래스 화하는 또 다른 방법이 있지만이 것에 익숙하지 않아보기를 포함하는보기 컨트롤러가 하나있는 것이 좋습니다.

참고 : 각보기에서 모든 개체를 프로그래밍 방식으로 만드는 경우 숨겨진보기에서 개체를 제거하여 뛰어난 성능을 얻을 수 있습니다.

처음에는 UISegmentedControl (iPatel의 답변에서 생성)이 있습니다. 그러나 switchViewControllers 넣어에서 [ctrl addTarget:self action:@selector(switchViewControllers) forControlEvents:UIControlEventValueChanged];

그런 다음이 줄을 추가 : 세그먼트 제어를 전환 할 때

if (ctrl.selectedSegmentIndex == 0) { 
    NSLog(@"One"); 
    self.viewOne.hidden = NO; 
    self.viewTwo.hidden = YES; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:@"showView" forKey:@"viewOne"]; 
    [defaults synchronize]; 
} 
else if (ctrl.selectedSegmentIndex == 1) { 
    NSLog(@"Two"); 
} 

-(void)viewDidLoad { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([[defaults objectForKey:@"showView"] isEqualToString:@"viewOne"]) { 
     self.viewOne.hidden = NO; 
     self.viewTwo.hidden = YES; 
    } 
    else if (...) { 

    } 
} 

은 위의 작동합니다. 각 if에서 두보기의 가시성을 토글 할 수 있습니다. 다른보기를 기본보기의 하위보기로 작성합니다. 하나는 다른 하나의 위에 있습니다. Interface Builder 나 viewDidLoad에서 한 뷰를 숨길 필요가 있습니다. NSUserDefaults에 현재 뷰를 저장하고 사용자가 뷰 컨트롤러를 처음로드 할 때 뷰를 표시하는 것이 좋습니다.

관련 문제