使用storyboard进行导航
在实际开发过程中storyboard并不那么实用,虽然它很适合初学者开发但是对于复杂应用有时候用起来并不是那么容易,因此在这个系列的文章中 很少使用storyboard方式进行示例演示。但是,鉴于很多初学者在学习UINavigationController时看到的多数是使用 storyboard方式创建导航,而且storyboard中的segue很多初学者不是很了解,这里简单对storyboard方式创建导航进行介 绍。
下面简单做一个类似于iOS系统设置的导航程序,系统默认进入Settings视图控制器,在Settings界面点击General进行General视图,点击Sounds进入Sounds视图,就那么简单。
1.首先在Main.storyboard中拖拽一个UINavigationController将应用启动箭头拖拽到新建的 UINavigationController中将其作为默认启动视图,在拖拽过程中会发现UINavigationController默认会带一个 UITableViewController作为其根控制器。
2.设置UITableViewController的标题为“Settings”,同时设置UITableView为静态表格并且包含两行,分别在两个UITableViewCell中放置一个UILabel命名为”General”和“Sounds”。
3.新建两个UITableViewController,标题分别设置为“General”、“Sounds”,按住Ctrl拖拽 “Settings”的第一个UITableViewCell到视图控制器“General”,同时选择segue为“push”,拖拽第二个 UITableViewCell到视图控制器“Sounds”,同时选择segue为“push”。
到这里其实我们已经可以通过Settings视图导航到General和Sounds视图了,但是storyboard是如何处理导航的呢?
前面我们看到导航的过程是通过一个名为“Segue”连接创建的(前面采用的是push方式),那么这个Segue是如何工作的呢?Segue的工作方式分为以下几个步骤:
1.创建目标视图控制器(也就是前面的General、Sounds视图控制器)
2.创建Segue对象
3.调用源视图对象的prepareForSegue:sender:方法
4.调用Segue对象的perform方法将目标视图控制器推送到屏幕
5.释放Segue对象
要解释上面的过程首先我们定义一个KCSettingsTableViewController控制器,它继承于 UITableViewController,然后在storyboard中设置“Settings”视图控制器的class属性为 KCSettingsTableViewController。同时设置导航到“General”视图控制器的segue的Identifier为 “GeneralSegue”,设置导航到“Sounds”控制器的segue的Identifier为“SoundsSegue”。
然后修改KCSettingsTableViewController.m添加如下代码:
- #pragma mark - 导航
- -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
- //源视图控制器
- UITableViewController *settingController=segue.sourceViewController;
- //目标视图控制器
- UITableViewController *tableViewController=segue.destinationViewController;
- NSLog(@"sourceController:%@,destinationController:%@",settingController.navigationItem.title,tableViewController.navigationItem.title);
- }
此时运行程序导航我们会发现此方法会被调用的同时可以打印源视图控制器和目标视图控制器的信息,这一步对应上面所说的第三个步骤。
接着在”Settings”视图控制器的导航栏左右两侧分别放一个UIBarButtonItem并添加对应事件代码如下:
- - (IBAction)toGeneral:(id)sender {
- [self performSegueWithIdentifier:@"GeneralSegue" sender:self];
- }
- - (IBAction)toSounds:(id)sender {
- [self performSegueWithIdentifier:@"SoundsSegue" sender:self];
- }