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
- IOS学习日志(Controller)1.4
- IOS学习日志(Controller)1.1
- IOS学习日志(Controller)1.2
- IOS学习日志(Controller)1.3
- IOS学习日志(Controller)1.5
- IOS学习日志(Controller)1.6
- IOS学习日志(Controller)1.7
- IOS学习日志(Controller)1.8
- IOS学习日志(Controller)1.9
- IOS学习日志(OC)1.4
- iOS学习- 05 Navigation Controller
- iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (1)
- iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (3)
- iOS学习日志
- IOS学习——Navigation Controller
- iOS学习- 05 Tab Bar Controller
- 日志AOP拦截Controller
- controller日志AOP处理
- 大数据学习-scala作业(2)
- OpenNI各版本下载地址
- MyCat中ER表子表批量插入效率低的解决方案
- 从ICLassFactory 为 CLSID的COM组建创建实例失败 c001f011
- Numpy:基础
- IOS学习日志(Controller)1.4
- ones,zeros,size用法总结
- spring03 AOP、各种通知、一/多个切面例子
- 深度学习入门资源索引
- 阿里云服务器Ubuntu安装mysql
- 从ZooKeeper源代码看如何实现分布式系统(一)概述
- java 内部类 和 匿名内部类
- lingo求解最短路和最大流问题
- spring04 数据库操作 spring+jdbc/hibernate 及其声明式事务处理