• IOS-界面传值


    第二个视图控制器如何获取第一个视图控制器的部分信息

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

    这就需要用到属性传值、block传值

    那么第一个视图控制器如何获的第二个视图控制器的部分信息

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

    这就需要使用代理传值

    页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五种传值方式:

    (一)属性传值 

    第二个界面中的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 } 
    复制代码
    复制代码
    复制代码

    (五)通知传值

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

    1、注册通知

    2、通知中心发送一条消息通知,其中name前后一定要一样

    3、实现通知中心内部的方法,并实现传值

    4、消息发送完,要移除掉。(页面将要消失的时候)

    A页面RootViewController.m

    SecondViewController.m

     
     
  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5424531.html
Copyright © 2020-2023  润新知