斯坦福大学公开课 iOS应用开发教程学习笔记(第六课)多个MVC的程序和故事版、UINavigationController、 Segues

来源:互联网 发布:odysseus windows 编辑:程序博客网 时间:2024/05/17 04:51

 斯坦福大学公开课 iOS应用开发教程学习笔记(第六课)多个MVC的程序和故事版、UINavigationController、 Segues


1、多个MVC

前面的程序都是一个MVC,多个View时,怎么办,那就需要多个Controller。
一个MVC一次只能控制一个屏幕或更小的区域。

那如何切换两个MVC呢,用控制器群里的控制器:UINavigationController。



2、UINavigationController是个控制器

继承于UIVIewController,UINavigationController中间有个title。

它是个特殊的controller,因为它有一个Outlet只向一另外一个MVC,就是它的rootViewController。

rootViewController就是出现在白色区域的。原来的rootViewController放到UINavigationController后,它的bounds高度会变小一些。

通过执行一个segues,可以跳转到另外一个MVC上。就是把新的MVC push都屏幕上,点返回,把当前的MVC pop出来。


3、segues

segues有三种方式:

push 

model

custom 


4、添加Navigation Controller

选中你要嵌入的view Controllser,然后通过Editor的 Embed in包含进来一个Navigation Controller。
或者直接拖动到一个viewController连接;



这个箭头表示程序的开始。

 


5、pop一个ViewController的方法:

- (void)popViewControllerAnimated:(BOOL)animated;  


6、两个关于segues非常重要的方法


跳转前准备的方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{if ([segue.identifier isEqualToString:@“DoAParticularThing”]) {    UIViewController *newController = segue.destinationViewController;}}
可以决定你是否跳转到这个页面,获取到即将跳转页面的controller的实例,这样可以提前去设置它的属性。

通过Identifier跳转的方法:

- (void)performSegueWithIdentifier:(NSString *)segueId sender:(id)sender;

 例子:  
- (IBAction)rentEquipment{if (self.snowTraversingTalent == Skiing) {[self performSegueWithIdentifier:@“AskAboutSkis” sender:self];} else {[self performSegueWithIdentifier:@“AskAboutSnowboard” sender:self];}}


7、通过故事版来实例化一个ViewController的方法

NSString *vcid = @“something”;UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:vcid];
给视图命名 identifier

调用self.storyboard是一个ViewController的属性。

例子:
- (IBAction)doit{DoitViewController *doit =     [self.storyboard instantiateViewControllerWithIdentifier:@”doit1”];doit.infoDoitNeeds = self.info;[self.navigationController pushViewController:doit animated:YES];}
可以不通过segue创建一个视图控制器
获取后,把它push到navigationController展示。


8、一个StoryBoard和Segues的Demo

Psychologist,再次使用happens MVC;
主要内容:

  • 在两个viewController之间创建segue
  • 把ViewController内嵌到NavigationController中去。


segue有两个很重要的属性

这两个属性在跳转时经常用到

  • identifier 
  • destinationViewController

整个项目的源码下载:https://github.com/junxianhu/Phychologist


许多代码复用了第五课的FaceView;
这里主要是mainstoryBoard,以及ViewController。
贴部分代码:
ViewController.m
@@ -0,0 +1,67 @@////  ViewController.m//  Phychologist////  Created by cipher on 15/10/20.//  Copyright © 2015年 com.lab1411.cipher. All rights reserved.//#import "ViewController.h"#import "FaceViewController.h"@interface ViewController ()@property (nonatomic) int diagnosis;@end@implementation ViewController@synthesize diagnosis=_diagnosis;-(void)setAndShowDiagnosis:(int)diagnosis{    self.diagnosis = diagnosis;    [self performSegueWithIdentifier:@"showDiagnosis" sender:self];}//单独的子view//-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{//    if ([segue.identifier isEqualToString:@"showDiagnosis"]) {//        [segue.destinationViewController setHappiness:self.diagnosis];//    }//}//每个button单独建立一个segue//重新换了一个view界面,一直不执行该方法,原因是新的view中虽然三个button分别push了//但是,这个新的view没有选择class,记住一定要选择viewController,一定要关联-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{    if ([segue.identifier isEqualToString:@"showDiagnosis"]) {        [segue.destinationViewController setHappiness:self.diagnosis];    }else if([segue.identifier isEqualToString:@"celebrity"]){        [segue.destinationViewController setHappiness:80];    }else if([segue.identifier isEqualToString:@"serious"]){        [segue.destinationViewController setHappiness:20];    }else if([segue.identifier isEqualToString:@"TV"]){        [segue.destinationViewController setHappiness:50];    }}//每个button,引出不同的调用参数- (IBAction)flying {    [self setAndShowDiagnosis:85];    //segue    //[self performSegueWithIdentifier:@"showDiagnosis" sender:self];}- (IBAction)apple {    [self setAndShowDiagnosis:85];}- (IBAction)dragones {    [self setAndShowDiagnosis:20];}-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{    return YES;}@end



整个的mainStoryBoard如下:

整个的页面图如下:
  。。。。。。

  
  

。。。。

0 0
原创粉丝点击