2013-02-08 42 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 2013-02-08 14:33:56

+0

哪裏可以分段控制器? – iPatel 2013-02-08 14:34:08

+0

我想到了,但不清楚如何有效地執行它 – 2013-02-08 14:35:32

回答

1

有關添加UISegmentedControlUINavigationBar

編輯:

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 – 2013-02-08 14:44:30

+0

我想在segemted控制的圖像不是字符串:/ – 2013-02-08 15:05:15

+0

解決了你的代碼,謝謝 – 2013-02-08 15:09:13

1

我想性能問題可能需要具有單獨的視圖控制器,而不是兩個子視圖,但它更復雜 - 你會有一個非常compli命名導航系統,並需要爲每個視圖設置段控制。我相信有另一種方法來繼承一個視圖,但我不熟悉這個,所以會建議有一個包含你的視圖的視圖控制器。

注意:如果您要以編程方式在每個視圖中創建所有對象,則可以通過從任何隱藏視圖中刪除對象來實現出色的性能。

所以首先你有一個UISegmentedControl(在iPatel的答案中創建)。但在這行添加[ctrl addTarget:self action:@selector(switchViewControllers) forControlEvents:UIControlEventValueChanged];

然後在switchViewControllers地說:

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中,並在用戶第一次加載視圖控制器時顯示該視圖)。