IOS 学习笔记(Navigation Controller)PART 7

有一件值得伤心的事,团队发生了一次较大的人事变动,之前在运营的游戏,恐怕再难保持之前的风格了。那感觉好像养了多年的黄花大闺女,要拿去给人糟蹋一样。整个团队现在也处于极度的震荡中。唯有继续学习才可以让我保持心神稳定。

就我目前见过的设计模式来看,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;

希望事情不要再坏下去了,别逼我发威啊!

a206c0f4jw1edrbk9kfdhj20hi0ilac6