在 iOS5 中使用 UISegmentedControl 切换 ViewController
我正在尝试一些非常简单的事情,但不知何故我无法让它发挥作用。我尝试做的就是使用 UISegmentedControl 在 2 个视图控制器之间切换,就像您可以在 App Store 应用程序的“突出显示”选项卡中看到的那样。
我正在使用 iOS5 和故事板。
这是我的 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
我可以触发切换事件并可以记录当前选择的索引。但我不知道从这里该去哪里。
也许有人可以将我的注意力转向某个方向......?
I am trying something very simple but somehow I can't get it to work. All I try to do is switching between 2 View Controllers using an UISegmentedControl as you can see it for example in the App Store application in the Highlights tab.
I am using iOS5 and Storyboards.
Here's my Storyboad line up:
So I have a root View Controller and two UITableViews - This 2 TableViews I want to switch.
Here's how the implementation file looks like
#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
I can trigger the switch event and can log the currently selected index. But I don't have any idea where to go from here.
Maybe someone can turn my attention towards a certain direction...?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
该代码非常适合您的目的,我将其用于我的一个新应用程序。
它使用新的 UIViewController 包含 API,允许 UIViewController 在您自己的 UIViewController 中,而无需手动转发诸如
viewDidAppear:
之类的东西,我从 Ray Wenderlichs 书的第 22 章中得到了这些东西 iOS5 教程。
不幸的是,我没有教程的公共链接。但有一个 WWDC 2011 视频,标题为“实现 UIViewController Containment”
编辑
self.typeSegmentedControl
是您的UISegmentedControl
self.contentView< /code> 是容器视图的出口
self.currentViewController
只是我们用来存储当前使用的UIViewController
的属性This code works pretty well for your purpose, I use it for one of my new apps.
It uses the new UIViewController containment APIs that allow UIViewControllers inside your own UIViewControllers without the hassles of manually forwarding stuff like
viewDidAppear:
I got this stuff from chapter 22 of Ray Wenderlichs book iOS5 by tutorial.
Unfortunately I don't have a public link to a tutorial. But there is a WWDC 2011 video titled "Implementing UIViewController Containment"
EDIT
self.typeSegmentedControl
is outlet for yourUISegmentedControl
self.contentView
is outlet for your container viewself.currentViewController
is just a property that we're using to store our currently usedUIViewController
这是 Matthias Bauch 的解决方案,但无论如何还是想在 Swift 中分享它!
编辑:
添加指向 Swift 2.0 现成演示应用程序的链接。
https://github.com/ahmed-abdurrahman/taby-segmented-control
It's Matthias Bauch solution, but thought of sharing it in Swift anyway!
Edit:
Adding a link to a Swift 2.0 ready made demo app.
https://github.com/ahmed-abdurrahman/taby-segmented-control
对于想要在快速
故事板视图
中实现相同功能的人
For someone want to implement the same in swift
Storyboard view
A是根视图控制器,B、C是子视图控制器。
当您单击segment时,添加子视图控制器。
结果
设计
代码
A is root view controller, and B, C is sub view controller.
When you click segment, add sub view controller.
result
design
code
您可以将初始视图控制器嵌入到导航控制器中。通过在故事板中选择视图控制器,然后选择编辑器 -> 嵌入 -> 导航控制器来完成此操作。
在你的indexDidChangeForSegmentedControl:方法中,你只需将相应的视图控制器推送到导航堆栈:
但是当你使用故事板时,你的方法根本没有多大意义。
我不知道是否可以使用 Segues 将单个分段控制按钮连接到视图控制器。试试吧。
You could embed your initial view controller in a navigation controller. Do that by selecting the view controller in the storyboard, then Editor->Embed in->Navigation Controller.
In your indexDidChangeForSegmentedControl: method you simply push the corresponding view controller to the navigation stack:
But your approach makes not too much sense at all when you are using storyboards.
I don't know whether you can wire up a single segmented control button to a view controller using segues. Just try it.
我最终使用导航控制器来实现类似的功能。
I ended up using a navigation controller to achieve a similar functionality.