2013-02-08 116 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中,并在用户第一次加载视图控制器时显示该视图)。