在iOS5中使用UISegmentedControl切换ViewControllers

MrB*_*rBr 37 uisegmentedcontrol uiviewcontroller uikit ios

我正在尝试一些非常简单的事情,但不知怎的,我无法让它发挥作用.我尝试做的就是使用UISegmentedControl在2个视图控制器之间切换,例如你可以在Highlights选项卡的App Store应用程序中看到它.

我正在使用iOS5和Storyboard.

这是我的Storyboad阵容:

在此输入图像描述

所以我有一个根视图控制器和两个UITableViews - 这2个我想切换的TableViews.

这是实现文件的样子

#import "SegmentedLocationViewController.h"
#import "PastEventsLocationViewController.h"
#import "FutureEventsLocationViewController.h"

@interface SegmentedLocationViewController()
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentedControl;
@property (strong, nonatomic) NSArray *viewControllers;
@end


@implementation SegmentedLocationViewController

@synthesize segmentedControl = _segmentedControl;
@synthesize viewControllers = _viewControllers;

- (IBAction)indexDidChangeForSegmentedControl:(UISegmentedControl*)segmentedControl
{
    NSLog(@"index: %d", segmentedControl.selectedSegmentIndex);
}

- (void)setupViewControllers
{
    PastEventsLocationViewController *pastEventsLocationViewController = [[PastEventsLocationViewController alloc] initWithStyle:UITableViewStylePlain];
    FutureEventsLocationViewController *futureEventsLocationViewController = [[FutureEventsLocationViewController alloc] initWithStyle:UITableViewStylePlain];

    self.viewControllers = [NSArray arrayWithObjects:pastEventsLocationViewController, futureEventsLocationViewController, nil];
}

- (void)setupUI
{
    [self.segmentedControl addTarget:self action:@selector(indexDidChangeForSegmentedControl:) forControlEvents:UIControlEventValueChanged];
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setupViewControllers];
    [self setupUI];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

@end
Run Code Online (Sandbox Code Playgroud)

我可以触发switch事件并可以记录当前选择的索引.但我不知道从哪里开始.

也许有人可以将我的注意力转向某个方向......?

Mat*_*uch 82

此代码非常适合您的目的,我将其用于我的一个新应用程序.
它使用新的UIViewController包含API,允许你自己的UIViewControllers中的UIViewControllers,而无需手动转发像viewDidAppear:

- (void)viewDidLoad {
    [super viewDidLoad];
    // add viewController so you can switch them later. 
    UIViewController *vc = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex];
    [self addChildViewController:vc];
    vc.view.frame = self.contentView.bounds;
    [self.contentView addSubview:vc.view];
    self.currentViewController = vc;
}
- (IBAction)segmentChanged:(UISegmentedControl *)sender {
    UIViewController *vc = [self viewControllerForSegmentIndex:sender.selectedSegmentIndex];
    [self addChildViewController:vc];
    [self transitionFromViewController:self.currentViewController toViewController:vc duration:0.5 options:UIViewAnimationOptionTransitionFlipFromBottom animations:^{
        [self.currentViewController.view removeFromSuperview];
        vc.view.frame = self.contentView.bounds;
        [self.contentView addSubview:vc.view];
    } completion:^(BOOL finished) {
        [vc didMoveToParentViewController:self];
        [self.currentViewController removeFromParentViewController];
        self.currentViewController = vc;
    }];
    self.navigationItem.title = vc.title;
}

- (UIViewController *)viewControllerForSegmentIndex:(NSInteger)index {
    UIViewController *vc;
    switch (index) {
        case 0:
            vc = [self.storyboard instantiateViewControllerWithIdentifier:@"FooViewController"];
            break;
        case 1:
            vc = [self.storyboard instantiateViewControllerWithIdentifier:@"BarViewController"];
            break;
    }
    return vc;
}
Run Code Online (Sandbox Code Playgroud)

通过教程从Ray Wenderlichs的书iOS5第22章得到了这些东西.不幸的是,我没有教学的公共链接.但是有一个WWDC 2011视频标题为"实现UIViewController遏制"

编辑

self.typeSegmentedControl 是你的出路 UISegmentedControl

self.contentView 是容器视图的出口

self.currentViewController 只是我们用来存储我们目前使用的属性 UIViewController

  • 这个摇滚男人.我刚刚在2个月后发现了[自我故事板].谢谢!! (3认同)

Abd*_*man 8

这是Matthias Bauch的解决方案,但无论如何都想过在Swift中分享它! 编辑: 添加指向Swift 2.0现成演示应用程序的链接. https://github.com/ahmed-abdurrahman/taby-segmented-control

var currentViewController: UIViewController?
@IBOutlet weak var contentView: UIView!
@IBOutlet weak var segmentedControl: UISegmentedControl!

@IBAction func switchHappeningTabs(sender: UISegmentedControl) {
    if let vc = viewControllerForSelectedSegmentIndex(sender.selectedSegmentIndex) {
        self.addChildViewController(vc)
        self.transitionFromViewController(self.currentViewController!, toViewController: vc, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromRight, animations: {
            self.currentViewController!.view.removeFromSuperview()
            vc.view.frame = self.contentView.bounds
            self.contentView.addSubview(vc.view)
            }, completion: { finished in
                vc.didMoveToParentViewController(self)
                self.currentViewController!.removeFromParentViewController()
                self.currentViewController = vc
            }
        )        
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    if let vc = self.viewControllerForSelectedSegmentIndex(self.segmentedControl.selectedSegmentIndex) {
        self.addChildViewController(vc)
        self.contentView.addSubview(vc.view)
        self.currentViewController = vc
    }
}

func viewControllerForSelectedSegmentIndex(index: Int) -> UIViewController? {
    var vc: UIViewController?
    switch index {
    case 0:
            vc = self.storyboard?.instantiateViewControllerWithIdentifier("FooViewController") as? UIViewController
    case 1:
            vc = self.storyboard?.instantiateViewControllerWithIdentifier("BarViewController") as? UIViewController
    default:
        return nil
    }

    return vc
}
Run Code Online (Sandbox Code Playgroud)