UI中的界面之间的值传递 <二>

从后往前传 —— 代理传值

代理传值 (代理是前一个界面, 协议在后一个界面写, 后一个界面是委托方, 前一个界面是被委托方.)

一 : 在后一个界面定义协议 (定义一个用于传值的方法, 而且方法必须要有参数, 参数类型要与所传数据的类型保持一致)

二 : 在后一个界面定义代理属性, 用来保存代理对象.

三 : 设置后一个界面的代理 -- 在前一个界面进入后一个界面之前, 设置前一个界面为后一个界面的代理.

四 : 前一个界面服从协议.

五 : 前一个界面实现协议中的方法.

六 : 后一个界面让代理执行协议中的方法 (执行方法时, 把传输的数据作为方法的参数进行传递), 时机 : 返回上一界面之前.

例如有两个视图控制器:

FirstViewController 和 SecondViewController

在这两个视图控制器中设置一个textField 和 label, 并且把SecondViewController的view上的textField上输入的text显示到FirstViewController的label上.

在SecondViewController.h文件中

#import <UIKit/UIKit.h>

// 代理传值 第一步 : 定义协议

@protocol SecondViewControllerDelegate <NSObject>

- (void)passValue:(NSString *)data;

@end

@interface SecondViewController : UIViewController

// 代理传值第二步 : 定义代理属性, 存储代理对象

@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;

@end

在FirstViewController.m文件中

#import "FirstViewController.h"

#import "SecondViewController.h"

// 代理传值第四步 : 服从协议.

@interface FirstViewController () <SecondViewControllerDelegate>

@end

@implementation FirstViewController

#pragma mark -- second view controller delegate

// 代理传值第五步 : 前一个界面实现协议中的方法

- (void)passValue:(NSString *)data {

((UILabel *)[self.view viewWithTag:200]).text = data;

}

- (void)viewDidLoad {

[super viewDidLoad];

/**

导航控制器的工作原理:

导航控制器以栈的形式管理视图控制器, 当进入下一个界面时, 该视图控制器入栈, 当返回上一界面时, 该视图控制器出栈, 入栈前, 视图控制器开辟空间, 出栈后, 视图控制器被系统回收, 屏幕永远显示的是导航控制器的栈顶元素.

*/

// 进入下一界面的按钮

[self setupButton];

// 设置TextField

[self setupTextField];

// 设置Label

[self setupLabel];

}

// 创建button

- (void)setupButton {

UIButton *pushBtn = [UIButton buttonWithType:UIButtonTypeSystem];

pushBtn.frame = CGRectMake(20, 100, 280, 40);

[pushBtn setTitle:@"进入下一个界面" forState:UIControlStateNormal];

pushBtn.backgroundColor = [UIColor blueColor];

[pushBtn addTarget:self action:@selector(handlePushBtn:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:pushBtn];

}

// 创建textField

- (void)setupTextField {

UITextField *textFiled = [[UITextField alloc] initWithFrame:CGRectMake(20, 230, 280, 40)];

textFiled.placeholder = @"显示到第二个界面上";

[self.view addSubview:textFiled];

textFiled.tag = 100;

textFiled.backgroundColor = [UIColor grayColor];

[textFiled release];

}

// 创建label

- (void)setupLabel {

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, 280, 40)];

label.backgroundColor = [UIColor whiteColor];

label.layer.borderWidth = 2;

label.layer.cornerRadius = 5;

label.tag = 200;

[self.view addSubview:label];

[label release];

}

#pragma mark -- button action

- (void)handlePushBtn:(UIButton *)sender {

// 代理传值, 从后往前传

// 1. 创建的二个视图控制器

SecondViewController *secondVC = [[SecondViewController alloc] init];

// 代理传值 第三步 :给后一个界面指定代理对象

secondVC.delegate = self;

// 2. 通过导航控制push到下一个界面(视图控制器自带的navigationController 属性能够获取到管理当前视图控制器的导航控制器, 然后, 再通过导航控制器进行push)

[self.navigationController pushViewController:secondVC animated:YES]; // 该行代码表示进入下一个界面.

// 3. 释放

[secondVC release];

}

@end

在SecondViewController.m 文件中

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {

[super viewDidLoad];

// 设置下一页面的按钮

[self setupPushButton];

// 设置TextField

[self setupTextField];

// 设置Label

[self setupLabel];

// 设置上一页面的按钮

[self setupPopButton];

}

// 创建button

- (void)setupButton {

UIButton *pushBtn = [UIButton buttonWithType:UIButtonTypeSystem];

pushBtn.frame = CGRectMake(20, 100, 280, 40);

[pushBtn setTitle:@"进入下一个界面" forState:UIControlStateNormal];

pushBtn.backgroundColor = [UIColor blueColor];

[pushBtn addTarget:self action:@selector(handlePushBtn:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:pushBtn];

}

// 创建textField

- (void)setupTextField {

UITextField *textFiled = [[UITextField alloc] initWithFrame:CGRectMake(20, 230, 280, 40)];

textFiled.placeholder = @"显示到第二个界面上";

[self.view addSubview:textFiled];

textFiled.tag = 100;

textFiled.backgroundColor = [UIColor grayColor];

[textFiled release];

}

// 创建label

- (void)setupLabel {

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, 280, 40)];

label.backgroundColor = [UIColor whiteColor];

label.layer.borderWidth = 2;

label.layer.cornerRadius = 5;

label.tag = 200;

[self.view addSubview:label];

[label release];

}

#pragma mark -- button action

- (void)handlePopBtn:(UIButton *)sender {

// 代理传值第六步 : 让代理执行任务

// 安全处理, 判断代理是否实现了方法, 防止崩溃

if ([self.delegate respondsToSelector:@selector(passValue:)]) {

[self.delegate passValue:[(UITextField *)[self.view viewWithTag:200] text]];

}

// 1. 返回上一界面

[self.navigationController popViewControllerAnimated:YES];

}

- (void)dealloc {

[_data release];

[super dealloc];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

时间: 2024-10-07 04:50:17

UI中的界面之间的值传递 <二>的相关文章

UI中的界面之间的值传递 &lt;一&gt;

一. 从前往后传 —— 属性传值 1< 在后面一个界面定义属性(属性的类型要和传输的数据的数据类型一致). 2< 在从前一个界面进入到下一个界面之前, 将数据传给下一个界面. 例如有两个视图控制器: FirstViewController 和 SecondViewController 在这两个视图控制器中设置一个textField 和 label, 并且把FirstViewController的view上的textField上输入的text显示到SecondViewController的lab

Backbone中父子view之间的值传递

backbone中,使用最多的莫过于在view中进行操作,如模板的渲染以及事件函数的定义.为了提高代码的可维护性,一般地我们会写多个视图即view,将界面按照功能的不同进行模块化划分,模块与view一一对应. 首先,我们会定义一个父view,在view中控制不同子view的渲染,子view之间尽量不产生联系.这样,代码之间的耦合度会降低很多,模块的功能明确化,同时降低了开发的难度.笔者最近在项目中遇到父子view传值问题,学习到了一个知识点,比较简单易懂.主要想分享两个内容:1.父子view是如

通过$broadcast或$emit在子级和父级controller之间进行值传递

1 通过$broadcast或$emit在controller之间进行值传递,不过这些controller必须是子级或者父级关系, 2 $emit只能向父级parent controller传递事件event与数据data,$broadcast只能向子级child controller传递event与data,$on用于接收event与data. 3 <script> 4 var myapp=angular.module('myapp',[]); 5 myapp.controller('Sel

Android笔记(二十) Activity中的跳转和值传递

我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 简单的跳转 AndroidManiFest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/andro

android界面之间数据的传递

不同界面之间,数据的传递是很常用的一个操作,这种数据的携带也是很简单的. 效果: 跳转后: 这个例子很简单,但是我们把第一个界面输入的姓名张三顺利传递到了第二个界面 附代码如下: 主界面: 1 package com.yy.activity.value; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.text.TextUt

c# Form之间进行值传递问题(参考)

在c#中,有时候会出现需要在2个Form中进行数据传递的问题,具体的说就是:我们往往需要把Form2中TextBox,Label,ComBox等控件的值传递给Form1类使用,网上也有许多做法,说的有的比较难理解,这里介绍一种比较容易理解的做法. 假设我们在Form2中有TextBox1和TexbBox2两个控件,我们想通过点击Form1中的Button1来输入Form2中TextBox1和TexbBox2的值,通过点击Form2中的Button2来计算这2个值的和,结果放在Form1中的Tex

c++ 中在形参与实参之间的值传递

主要是对比直接传递与引用类型.指针类型之间的区别. 1 #include <iostream> 2 using namespace std; 3 4 class MyClass 5 { 6 public: 7 int a; 8 void method(); 9 }; 10 void MyClass::method() 11 { 12 cout<<"the last value of class:a after fun:"<<a<<'\n'

HTML JS获取到table中所有的input的值 传递到前端

1.获取table对象 2.行循环.列循环然后遍历每一个格子里面的input值 3.用连接符连接 4.放置到form的隐藏域里面. 5.传递到后台. js代码:注意:1.input必须跟[0]否则无法取出值  2.在JS的双引号里面不能在用""改成''而且{}在引号里也会被识别报错.将字符串传回后台处理即可 function GetInfoFromTable() { var tableInfo = ""; var tableObj = document.getEle

JAVA中的值传递和引用传递问题

这是个老生常谈的问题了,引起过无数争论,但可以说一直没有一个令人满意的回答. 有人总结过: 对象是按引用传递的 Java 应用程序有且仅有的一种参数传递机制,即按值传递 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本 简单总结: 对象就是传引用(引用地址的拷贝,实质也是传值) 原始类型就是传值 String等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个