IOS学习日志(Controller)1.4

来源:互联网 发布:阿里云华南地区是哪里 编辑:程序博客网 时间:2024/06/04 23:31

1.多界面的切换

使用UIViewContrller的 presentViewController方法

present and dismiss

#import "MyViewController.h"#import "BViewController.h"@interface MyViewController ()@end@implementation MyViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}//点击按钮后,跳到B界面- (IBAction)gotoBVC:(id)sender {    //1.创建B界面所属的控制器的实例    BViewController *bvc=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];    //2.从当前控制器切换到B控制器    [self presentViewController:bvc animated:YES completion:nil];    }@end
#import "BViewController.h"@interface BViewController ()@end@implementation BViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}//点击按钮后,返回到A界面- (IBAction)goBack:(id)sender {    //系统记录从哪里切换过来的,使用dismiss回到上一个vc时,不要通过参数来指定回到哪里,系统会记录从哪个vc来到的b界面    [self dismissViewControllerAnimated:YES completion:nil];}@end

使用UINavigationController的push方法

push and pop

    a.什么是导航控制器?    作用:管理控制器的控制器    1.没有一个独立的显示的视图    2.但是能够管理多个控制器    3.完成多个控制器的切换
#import "AppDelegate.h"#import "AViewController.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];    //创建第一个要展示的A界面    AViewController *avc=[[AViewController alloc]initWithNibName:@"AViewController" bundle:nil];    //创建导航控制器的实例    UINavigationController *navi=[[UINavigationController alloc]initWithRootViewController:avc];    //设置window的根视图控制器    self.window.rootViewController=navi;    //显示window    [self.window makeKeyAndVisible];    // Override point for customization after application launch.    return YES;}
#import "AViewController.h"#import "BViewController.h"@interface AViewController ()@end@implementation AViewController- (void)viewDidLoad {    [super viewDidLoad];    //设置导航栏上的文字项    self.navigationItem.title=@"a界面";    // Do any additional setup after loading the view from its nib.}//点击按钮后跳到B界面- (IBAction)gotoBVC:(id)sender {    //1.创建b界面所属的控制器的实例    BViewController *bvc=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];    //2.由当前管理着avc的上面的那个导航负责push出新的B界面    [self.navigationController pushViewController:bvc animated:YES];}@end
#import "BViewController.h"@interface BViewController ()@end@implementation BViewController- (void)viewDidLoad {    [super viewDidLoad];    self.navigationItem.title=@"b界面";    // Do any additional setup after loading the view from its nib.}- (IBAction)goBack:(id)sender {    //通知当前管理bvc的那个导航,回到上一个界面    [self.navigationController popViewControllerAnimated:YES];}@end

2.1正向传值

如果A推出B,推出的过程中,A给B传值叫做正向传值

    传值,本质就是一个对象给另一个对象赋值,所以只要A拥有了B的引用,那么就能完成A给B赋值,也就完成了A给B传值的过程    步骤:        step1:为B公开一个属性,用于接收要传入的值        step2:A在推出B之前,已经创建了B的实例,也就是拥有了B的引用,所以直接使用该引用,为B公开的属性赋值        step3:B在界面呈现之前,将接收到的属性值显示注意:不能将bvc中界面的标签公开化,还让avc直接修改bvc界面中的标签,这样会破坏MVC的结构,通知,也失去了控制本身的作用,应该是,由一个控制器将数值传给另一个控制器,至于接收到数据的控制器,如何来显示数据,应该由这个控制器自己决定,不能由其他控制器决定,意思就是A不能直接操作B的界面,应该由B自己来决定界面如何显示
#import "AViewController.h"#import "BViewController.h"@interface AViewController ()@property (weak, nonatomic) IBOutlet UITextField *textField;@end@implementation AViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}//点击按钮后跳到B界面,并且将文本框的值传给B- (IBAction)gotoBVC:(id)sender {    //1.创建B的控制器实例    BViewController *bvc=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];    //2.在推出b之前,给b赋值,来完成传值的过程    bvc.str=self.textField.text;    //3.推出    [self presentViewController:bvc animated:YES completion:nil];}@end
#import <UIKit/UIKit.h>@interface BViewController : UIViewController//公开一个属性,用于接收A传入的数值@property (nonatomic,strong)NSString* str;@end
#import "BViewController.h"@interface BViewController ()@property (weak, nonatomic) IBOutlet UILabel *label;@end@implementation BViewController- (void)viewDidLoad {    [super viewDidLoad];    //将传入的str显示到标签上    self.label.text=self.str;    // Do any additional setup after loading the view from its nib.}- (IBAction)goback:(id)sender {    [self dismissViewControllerAnimated:YES completion:nil];}@end

2.2.1反向传值

#import <UIKit/UIKit.h>@interface AViewController : UIViewController//为了接收B回传回来的数据,公开一个属性@property (nonatomic,strong)NSString *backValue;@end
#import "AViewController.h"#import "BViewController.h"@interface AViewController ()@property (weak, nonatomic) IBOutlet UILabel *label;@end@implementation AViewController//执行时机:在试图第一次创建时,执行一次//如果运行过程中,试图曾经隐藏过,再显示,只要试图不曾销毁就不会重建,就不会执行viewDidLoad- (void)viewDidLoad {    [super viewDidLoad];    //将回传回来的值显示到标签上//    NSLog(@"viewDidLoad");    // Do any additional setup after loading the view from its nib.}//在视图即将显示时执行此方法//此方法会随着试图的隐藏及显示,而被执行多次-(void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    //将回传回来的值显示到标签上//    NSLog(@"viewWillAppear");    self.label.text=self.backValue;}-(void)viewDidAppear:(BOOL)animated{    [super viewDidAppear:animated];//    NSLog(@"viewDidAppear");}-(void)viewWillDisappear:(BOOL)animated{    [super viewWillDisappear:animated];//    NSLog(@"viewWillDisappear");}-(void)viewDidDisappear:(BOOL)animated{    [super viewDidDisappear:animated];//    NSLog(@"viewDidDisappear");}//点击按钮后,跳转到b界面- (IBAction)gotoBVC:(id)sender {    //1.创建bvc的实例    BViewController *bvc=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];    //2.AVC将自己的引用传给要推出的bvc,这样bvc就知道回来时要给哪个对象传值了    bvc.backReference=self;    //3.present出新的bvc    [self presentViewController:bvc animated:YES completion:nil];}@end
#import <UIKit/UIKit.h>#import "AViewController.h"@interface BViewController : UIViewController//为了能够让BVC访问到A控制器,所以,公开一个属性来存储A的引用//此处B不能再强引用A了//因为A推出B,A创建了B,A已经强引用了B,所以,如果B再反过来强引用A的话就形成了循环引用,有可能引起内存泄露,所以要将这个关系变成弱引用@property(nonatomic,weak)AViewController *backReference;@end
#import "BViewController.h"@interface BViewController ()@property (weak, nonatomic) IBOutlet UITextField *textField;@end@implementation BViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}//点击按钮后,跳转到a界面- (IBAction)goback:(id)sender {    //在返回之前,将要回传的数值赋给avc    self.backReference.backValue=self.textField.text;    [self dismissViewControllerAnimated:YES completion:nil];}@end

2.2.2反向传值_代理模式

如果A推出B,在从B返回到A的过程中,B给A返回一个值,叫做反向传值或回传数值

    b是委托方,做三件事:    1.定义协议    2.增加一个记录代理对象的引用属性    3.在合适的时机给代理发信息    A是代理方,做三件事    1.遵守协议    2.实现方法    3.将自己设置成为代理

content in AViewController.m

#import "AViewController.h"#import "BViewController.h"//1.遵守协议@interface AViewController ()<BViewControllerDelegate>@property (weak, nonatomic) IBOutlet UILabel *label;@end@implementation AViewController//2.实现方法-(void)bViewController:(BViewController *)bvc didFinishInput:(NSString *)str{    //将发来的消息显示到标签上    self.label.text=str;}- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}- (IBAction)gotoBVC:(id)sender {    //1.创建BVC的实例    BViewController *bvc=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];    //3.将自己设置成为代理    bvc.delegate=self;//????????    //2.推出    [self presentViewController:bvc                       animated:YES completion:nil];}@end

content in BViewController.h

#import <UIKit/UIKit.h>@class BViewController;//1.定义一个协议,用于约束代理方,通过提前定义好一个方法名,以此告诉代理方,要发的消息的名称是什么//定义协议的规则:// a.协议名  委托方名+Delegate// b.方法名要尽量体现出发消息的时机// c.方法的第一个参数一定是委托方自己@protocol BViewControllerDelegate <NSObject>-(void)bViewController:(BViewController *)bvc didFinishInput:(NSString*)str;@end@interface BViewController : UIViewController//2.公开一个属性,用于记录代理方对象的引用@property(nonatomic,strong)id<BViewControllerDelegate> delegate;@end

content in BViewController.m

#import "BViewController.h"@interface BViewController ()@property (weak, nonatomic) IBOutlet UITextField *textField;@end@implementation BViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view from its nib.}//点击返回按钮后,回到A界面- (IBAction)goback:(id)sender {    //3.在即将消失之前,给代理发消息,告诉要显示的内容是什么    //self.delegate遵守协议的,里面有方法bViewController: didFinishInput,B主动的给self.delegate发送了这样一个消息,谁是委托方告诉给代理,将显示什么数据    [self.delegate bViewController:self didFinishInput:self.textField.text];    [self dismissViewControllerAnimated:YES completion:nil];}@end
0 0
原创粉丝点击