zoukankan      html  css  js  c++  java
  • iOS传值方式:属性,代理,block,单例,通知

    正向传值均可,反向传值除属性传值不可,其余均可。下面简单介绍:

    (一)属性传值 

    第二个界面中的lable显示第一个界面textField中的文本

    首先我们建立一个RootViewControllers和一个DetailViewControllers,在DetailViewControllers中声明一个textString属性,用于接收传过来的字符串,

    技术分享

    同时创建一个Lable用来显示传过的字符串

    技术分享

    在RootViewControllers上引入DetailViewControllers同时声明一个textField属性用来输入字符串

    技术分享

    然后在RootViewControllers上我们创建并添加一个button,当点击button时响应相应方法进行视图间的切换完成视图间的传值

    技术分享

    (二)Block传值

    block传值也是从第一个界面给第二个界面传值

    首先我们在DetailViewcontrollers的.h文件中,属性

    技术分享

    在RootViewControllers的.m文件中,其他不变,在button的响应方法里我们为block属性赋值完成block传值

    技术分享

    (三)代理传值

    RootViewControllers页面push到DetailViewControllers页面,如果DetailViewControllers页面的信息想回传(回调)到RootViewControllers页面,用代理传值,其中DetailViewControllers定义协议和声明代理,RootViewControllers确认并实现代理,RootViewControllers作为DetailViewControllers的代理

    首先在DetailViewControllers.h文件中我们创建协议方法

    技术分享

    在DetailViewControllers的.m中我们判定代理对象存在时,为其绑定相应方法

    技术分享

    RootViewControllers的.m文件中我们指定代理并让其执行代理的方法

    技术分享

    (四)单例传值

    单例传值(实现共享)

    AppStatus.h  创建一个单例类 AppStatus

    技术分享
     1 #import <Foundation/Foundation.h>
     2 
     3 @interface AppStatus : NSObject
     4 {
     5     NSString *_contextStr;
     6 }
     7 
     8 @property(nonatomic,retain)NSString *contextStr;
     9 
    10 +(AppStatus *)shareInstance;
    11 
    12 @end
    技术分享

    AppStatus.m

    技术分享
     1 #import "AppStatus.h"
     2 
     3 @implementation AppStatus
     4 
     5 @synthesize contextStr = _contextStr;
     6 
     7 static AppStatus *_instance = nil;
     8 
     9 +(AppStatus *)shareInstance
    10 {
    11     if (_instance == nil)
    12     {
    13         _instance = [[super alloc]init];
    14     }
    15     return _instance;
    16 }
    17 
    18 -(id)init
    19 {
    20     if (self = [super init])
    21     {
    22         
    23     }
    24     return self;
    25 }
    26 
    27 -(void)dealloc
    28 {
    29     [super dealloc];
    30 }
    31 
    32 @end
    技术分享

    RootViewController.h

    技术分享
     1 #import "RootViewController.h"
     2 #import "DetailViewController.h"
     3 #import "AppStatus.h"
     4 
     5 @interface RootViewController ()
     6 
     7 @end
     8 
     9 @implementation RootViewController
    10 
    11 -(void)loadView
    12 {
    13     //核心代码 
    14     UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    15     btn.frame = CGRectMake(0, 0, 100, 30);
    16     [btn setTitle:@"Push" forState:0];
    17     [btn addTarget:self action:@selector(pushAction:) forControlEvents:UIControlEventTouchUpInside];
    18     [self.view addSubview:btn];
    19 }
    20 
    21 -(void)pushAction:(id)sender
    22 {
    23     tf = (UITextField *)[self.view viewWithTag:1000];
    24 
    25  //单例传值  将要传递的信息存入单例中(共享中)
    26   //  [[AppStatus shareInstance]setContextStr:tf.text]; 跟下面这种写法是等价的
    27     [AppStatus shareInstance].contextStr = tf.text;
    28     //导航push到下一个页面
    29     //pushViewController 入栈引用计数+1,且控制权归系统
    30     DetailViewController *detailViewController = [[DetailViewController alloc]init];
    31 
    32     //导航push到下一个页面
    33     [self.navigationController pushViewController:detailViewController animated:YES];
    34     [detailViewController release];
    35 } 
    36 
    37 @end
    技术分享

    DetailViewController.h

    技术分享
    1 #import <UIKit/UIKit.h>
    2 @protocol ChangeDelegate;//通知编译器有此代理
    3 
    4 @interface DetailViewController : UIViewController
    5 {
    6     UITextField *textField;
    7 }
    8 
    9 @end
    技术分享

    DetailViewController.m

    技术分享
     1 #import "DetailViewController.h"
     2 #import "AppStatus.h"
     3 
     4 @interface DetailViewController ()
     5 
     6 @end
     7 
     8 @implementation DetailViewController
     9 
    10 @synthesize naviTitle = _naviTitle;
    11 
    12 -(void)loadView
    13 {
    14     self.view = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]autorelease];
    15 
    16     //单例
    17     self.title = [AppStatus shareInstance].contextStr;
    18     textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];
    19     textField.borderStyle = UITextBorderStyleLine;
    20     [self.view addSubview:textField];
    21     [textField release];
    22 
    23     UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];
    24     self.navigationItem.rightBarButtonItem = doneItem;
    25     [doneItem release];
    26 }
    27 
    28 //这个方法是执行多遍的  相当于刷新view
    29 -(void)viewWillAppear:(BOOL)animated
    30 {
    31     [super viewWillAppear:animated];
    32     tf = (UITextField *)[self.view viewWithTag:1000];
    33     tf.text = [AppStatus shareInstance].contextStr;
    34 }
    35 
    36 //pop回前一个页面
    37 -(void)doneAction:(id)sender
    38 {
    39     //单例传值
    40     [AppStatus shareInstance].contextStr = textField.text;
    41     [self.navigationController popToRootViewControllerAnimated:YES];
    42 } 
    技术分享

    (五)通知传值

    谁要监听值的变化,谁就注册通知  特别要注意,通知的接受者必须存在这一先决条件

    A页面RootViewController.h

    技术分享
    1 #import <UIKit/UIKit.h>
    2 #import "DetailViewController.h"
    3 @interface RootViewController : UIViewController<ChangeDelegate>
    4 {
    5     UITextField *tf;
    6 }
    7 @end 
    技术分享

    A页面RootViewController.m

    技术分享
     1 #import "IndexViewController.h"
     2 #import "DetailViewController.h"
     3 #import "AppStatus.h"
     4 
     5 @implementation IndexViewController
     6 
     7 -(void)dealloc
     8 {
     9     [[NSNotificationCenter defaultCenter] removeObserver:self
    10                                                     name:@"CHANGE_TITLE" object:nil];
    11     [super dealloc];
    12 }
    13 
    14 -(id)init
    15 {
    16     if (self = [super init])
    17     {
    18         [[NSNotificationCenter defaultCenter] addObserver:self
    19                                                  selector:@selector(change:)
    20                                                      name:@"CHANGE_TITLE"
    21                                                    object:nil];
    22     }
    23     return self;
    24 }
    25 
    26 -(void)change:(NSNotification *)aNoti
    27 {
    28     // 通知传值
    29     NSDictionary *dic = [aNoti userInfo];
    30     NSString *str = [dic valueForKey:@"Info"];
    31     
    32     UITextField *tf =  (UITextField *)[self.view viewWithTag:1000];
    33     tf.text = str;
    34 }
    35  
    36 -(void)viewWillAppear:(BOOL)animated
    37 {
    38     [super viewWillAppear:animated];
    39     /*
    40     // 单例传值
    41     UITextField *tf =  (UITextField *)[self.view viewWithTag:1000];
    42     tf.text = [AppStatus shareInstance].contextStr;
    43     */
    44 }
    45 
    46 @end
    技术分享

    DetailViewController.h

    技术分享
    1 #import <UIKit/UIKit.h>
    2 @protocol ChangeDelegate;//通知编译器有此代理
    3 
    4 @interface DetailViewController : UIViewController
    5 {
    6     UITextField *textField;
    7 }
    8 @end
    技术分享

     DetailViewController.m

    技术分享
     1 #import "DetailViewController.h"
     2 #import "AppStatus.h"
     3 
     4 @implementation DetailViewController
     5 @synthesize naviTitle = _naviTitle;
     6 
     7 -(void)loadView
     8 {
     9     UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];
    10     self.navigationItem.rightBarButtonItem = doneItem;
    11     [doneItem release];
    12 }
    13 
    14 // pop回前一个页面
    15 -(void)doneAction:(id)sender
    16 {
    17 NSDictionary *dic = [NSDictionary dictionaryWithObject:textField.text forKey:@"Info"];
    18 
    19 [[NSNotificationCenter defaultCenter] postNotificationName:@"CHANGE_TITLE" object:nil userInfo:dic];
    20 
    21 [self.navigationController popViewControllerAnimated:YES];
    22 
    23 }
  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/shaoting/p/4884534.html
Copyright © 2011-2022 走看看