IOS 学习笔记(Navigation Controller)PART 7
有一件值得伤心的事,团队发生了一次较大的人事变动,之前在运营的游戏,恐怕再难保持之前的风格了。那感觉好像养了多年的黄花大闺女,要拿去给人糟蹋一样。整个团队现在也处于极度的震荡中。唯有继续学习才可以让我保持心神稳定。
Navigation Controller
就我目前见过的设计模式来看,CocoTouch的Navigation controller是一个非常棒的手机视图管理系统,当然实现它的过程分成若干步骤,我会尝试记录下来,以备后需。
首先还是从建立一个空白项目开始,创建过程和创建StoryBoard的过程已经说过,不再重复,拖拽一个ViewController到空白的StoryBoard上,作为显示的1号视图,作为起始页面,为了方便区分,我在上面放一个按钮用来做跳转。
然后再拖拽一个ViewController到故事板,作为2号视图,hold 住 ctrl键,从View1的按钮,向View2的空白界面拖拽,在弹出的菜单上选择push,就得到了一个Segue,一个箭头,表明了从哪里到哪里,为了区分不同的Segue,可以给它们不同的identifier。
下面在拖拽一个视图ViewController 作为3号视图,然后重复上面的操作,让View2上的button可以有一个Segue指向View3,而对于View3上的按钮,我只是写着,to View 1,但是没有指向任何视图。
现在运行项目,点击第一个按钮,会有一个异常,说:
Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue ''. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'
所以这时候UINavigationController要派上用场了,UINavigationController的作用,是管理一组成序列的视图,可以通过指定不同的方式切换视图(这里指定的都是push,就是从屏幕右边推入目标视图),根视图是序列中第一个视图,叫做rootViewController。实现的办法是,选中已经编辑好了的一串带有Segue的视图中的第一个,然后点击菜单,Editor–>Embed In–>Navigation Controller
你会发现有两个变化,第一个是,这组视图每个的头部都多了一个扁扁的头条,我们可以在上面编辑不同视图的Title,其次是,编辑运行它之后,会发现它可以实现不同视图中的切换了。以及它会显示默认的回退按钮。操作之后,会发现UINavigationController非常适合做一组连续的功能,这些功能都从属于一个大的功能。
那么,如何在程序中做代码级的视图切换呢。首先是要为这些视图创建对应的ViewController(前文已经提到过),切换的方式有几种,我只列出两大类:
切换到指定标记的视图
假设想在View1中,加载完毕马上跳转到View2,代码如下:
- (void)viewDidLoad { [super viewDidLoad]; [self performSegueWithIdentifier:@"showView2" sender:self]; }
切换到根视图
比如我想在View3中,点击按钮后就回到根视图,代码如下:
- (IBAction)showView1:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES]; }
隐藏BackButton
self.navigationItem.hidesBackButton = YES;
日期处理和显示
这是之前漏记的,代码如下:
//已知日期转字符串 NSDate *today = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy年 MM月dd日"]; NSLog(@"今天是: %@",[dateFormatter stringFromDate:today]); //已知字符串转Date NSString *anotherDayStr = @"1982年 01月01日"; NSDate *anotherDay = [dateFormatter dateFromString:anotherDayStr]; NSLog(@"那一天是: %@",anotherDay);
实例类型转换
BREViewController *detailView = (BREViewController *)segue.destinationViewController;
希望事情不要再坏下去了,别逼我发威啊!