`
百合不是茶
  • 浏览: 354053 次
社区版块
存档分类
最新评论

页面之间的普通传值和反向传值

阅读更多

页面之间的数据传递是最基本的,下面就ios页面之间的数据传递需要理解的知识点整理一下

 

1,了解委托代理

2,协议的定义和实现(java的接口,Android的页面跳转使用的是Intent 所以不需要使用接口)

3,定义空白的window等(本人觉得最难的是按照网上的方法创建工程时,有一些方法找不到,建议在这一块找一个做ios开的人员指导一下)

 

 

一:普通数据传递  (ViewController页面输入框的值传到ViewController2页面并显示在输入框中)

a,定义ViewController和ViewController2页面并添加数据框和按钮

b,添加按钮的点击事件

c,将数据通过属传递到ViewController2页面

代码实现如下:

//
//  ViewController.h
//  test1114
//
//  Created by wang on 15/11/14.
//  Copyright © 2015年 wang. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

 ViewController.m

//
//  ViewController.m
//  test1114
//
//  Created by wang on 15/11/14.
//  Copyright © 2015年 wang. All rights reserved.
//

#import "ViewController.h"
#import "ViewController2.h"

@interface ViewController ()

@property UITextField*  tf1;
@property UITextField* tf2;

@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor=[UIColor yellowColor];
    self.navigationItem.title=@"第一个界面";
    //姓名输入框
    _tf1= [[UITextField alloc]init];
    _tf1.frame=CGRectMake(100, 100, 200, 30);
    //设置边框
    _tf1.borderStyle=UITextBorderStyleRoundedRect;
    //设置输入框的背景颜色
    _tf1.backgroundColor=[UIColor whiteColor];
    // 设置提示语
    _tf1.placeholder=@"请输入姓名";
    [self.view addSubview:_tf1];
    [_tf1 release];
    
    //创建button
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    //butto的大小
    btn.frame = CGRectMake(20, 100, 100, 300);
    //标题
    [btn setTitle:@"next" forState:UIControlStateNormal];
    
    
    //跳转
    [btn addTarget:self action:@selector(nextA) forControlEvents:UIControlEventTouchUpInside];
    //添加到view视图中
    [self.view addSubview:btn];
    
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//点击事件
- (void)nextA
{
    ViewController2 *viewCtr = [[ViewController2 alloc] init];
    
    viewCtr.userNameTitle=_tf1.text;//将输入框的值传递到第二个界面
    [self.navigationController pushViewController:viewCtr animated:YES];
    [viewCtr release];
}
 
@end

 

第二个页面

//
//  ViewController2.h
//  test1114
//
//  Created by wang on 15/11/15.
//  Copyright © 2015年 wang. All rights reserved.
//

#import <UIKit/UIKit.h>


@interface ViewController2 : UIViewController

@property(nonatomic,copy) NSString* userNameTitle;

@end

 .m文件

//
//  ViewController2.m
//  test1114
//
//  Created by wang on 15/11/15.
//  Copyright © 2015年 wang. All rights reserved.
//

#import "ViewController2.h"
#import "ViewController3.h"

@interface ViewController2 ()

@property UITextField* tf1;

@end

@implementation ViewController2

@synthesize userNameTitle=_userNameTitle;


- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    self.navigationItem.title=@"第二个页面";
    
    //姓名输入框
    _tf1= [[UITextField alloc]init];
    _tf1.frame=CGRectMake(100, 100, 200, 30);
    //设置边框
    _tf1.borderStyle=UITextBorderStyleRoundedRect;
    //设置输入框的背景颜色
    _tf1.backgroundColor=[UIColor whiteColor];
    // 设置提示语
    _tf1.placeholder=@"请输入姓名";
    
    _tf1.text=_userNameTitle;
    
    [self.view addSubview:_tf1];
    [_tf1 release];
   
  UIButton* btn= [UIButton buttonWithType:UIButtonTypeRoundedRect];

    btn.frame=CGRectMake(10, 200, 300, 200);
  
    [btn setTitle:@"跳转到第一个页面" forState:UIControlStateNormal];
    
    [btn addTarget:self action:@selector(ShowNext) forControlEvents:(UIControlEventTouchUpInside)];
    
    [self.view addSubview:btn];
    


    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/
     
-(void)ShowNext{
    
    //点击按钮返回到上一个界面,并将输入框的参数带到上一个界面
    
    NSString* btn=_tf1.text;
    NSLog(@"%@",_tf1.text);


    //设置视图出栈
    [self.navigationController popViewControllerAnimated:YES];

    
//    ViewController3 * vc3 = [[ViewController3 alloc]init];
//    
//    [self.navigationController pushViewController:vc3 animated:YES];
//    
//    [vc3 release];
     }

@end

 

2,第二页面输入框的值传递到第一个页面

 

//
//  ViewController.h
//  test1114
//
//  Created by wang on 15/11/14.
//  Copyright © 2015年 wang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "ViewController2.h"

/**
 实现代理,接收ViewController2代理传过来的值
 */
@interface ViewController : UIViewController<IntentFrist>


@end

 

 

//
//  ViewController.m
//  test1114
//
//  Created by wang on 15/11/14.
//  Copyright © 2015年 wang. All rights reserved.
//

#import "ViewController.h"
#import "ViewController2.h"

@interface ViewController ()

@property UITextField*  tf1;
@property UITextField* tf2;

@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor=[UIColor yellowColor];
    self.navigationItem.title=@"第一个界面";
    //姓名输入框
    _tf1= [[UITextField alloc]init];
    _tf1.frame=CGRectMake(100, 100, 200, 30);
    //设置边框
    _tf1.borderStyle=UITextBorderStyleRoundedRect;
    //设置输入框的背景颜色
    _tf1.backgroundColor=[UIColor whiteColor];
    // 设置提示语
    _tf1.placeholder=@"请输入姓名";
    [self.view addSubview:_tf1];
    [_tf1 release];
    
    //创建button
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    //butto的大小
    btn.frame = CGRectMake(20, 100, 100, 300);
    //标题
    [btn setTitle:@"next" forState:UIControlStateNormal];
    
    
    //跳转
    [btn addTarget:self action:@selector(nextA) forControlEvents:UIControlEventTouchUpInside];
    //添加到view视图中
    [self.view addSubview:btn];
    
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//点击事件
- (void)nextA
{
    ViewController2 *viewCtr = [[ViewController2 alloc] init];
    
    viewCtr.userNameTitle=_tf1.text;//将输入框的值传递到第二个界面
    viewCtr.delegate=self;
    [self.navigationController pushViewController:viewCtr animated:YES];
    [viewCtr release];
}

#pragma mark -实现协议,并接收传值
-(void)getUserNameTitle:(NSString *)userNameTitle{

    NSLog(@"%@",userNameTitle);
    _tf1.text=userNameTitle;

}

@end

 

第二个页面

  

//
//  ViewController2.h
//  test1114
//
//  Created by wang on 15/11/15.
//  Copyright © 2015年 wang. All rights reserved.
//

#import <UIKit/UIKit.h>

/**
 使用协议代理传值
 */

@protocol IntentFrist <NSObject>

-(void)getUserNameTitle:(NSString*) userNameTitle;

@end



@interface ViewController2 : UIViewController
//类实现委托代理

@property(nonatomic,assign)id<IntentFrist> delegate;//实现代理

@property(nonatomic,copy) NSString* userNameTitle;

@end

 

 

//
//  ViewController2.m
//  test1114
//
//  Created by wang on 15/11/15.
//  Copyright © 2015年 wang. All rights reserved.
//

#import "ViewController2.h"
#import "ViewController3.h"

@interface ViewController2 ()

@property UITextField* tf1;

@end

@implementation ViewController2

@synthesize userNameTitle=_userNameTitle;
@synthesize  delegate=_delegate;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    self.navigationItem.title=@"第二个页面";
    
    //姓名输入框
    _tf1= [[UITextField alloc]init];
    _tf1.frame=CGRectMake(100, 100, 200, 30);
    //设置边框
    _tf1.borderStyle=UITextBorderStyleRoundedRect;
    //设置输入框的背景颜色
    _tf1.backgroundColor=[UIColor whiteColor];
    // 设置提示语
    _tf1.placeholder=@"请输入姓名";
    
    _tf1.text=_userNameTitle;
    
    [self.view addSubview:_tf1];
    [_tf1 release];
   
  UIButton* btn= [UIButton buttonWithType:UIButtonTypeRoundedRect];

    btn.frame=CGRectMake(10, 200, 300, 200);
  
    [btn setTitle:@"跳转到最后一个页面" forState:UIControlStateNormal];
    
    [btn addTarget:self action:@selector(ShowNext) forControlEvents:(UIControlEventTouchUpInside)];
    
    [self.view addSubview:btn];
    


    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/
     
-(void)ShowNext{
    
    //点击按钮返回到上一个界面,并将输入框的参数带到上一个界面
    
    NSString* btn=_tf1.text;
    NSLog(@"%@",_tf1.text);
//    if ([_delegate respondsToSelector:@selector(nextA:)]) {
        [_delegate getUserNameTitle:_tf1.text];
//    }

    //设置视图出栈
    [self.navigationController popViewControllerAnimated:YES];

    
//    ViewController3 * vc3 = [[ViewController3 alloc]init];
//    
//    [self.navigationController pushViewController:vc3 animated:YES];
//    
//    [vc3 release];
     }

@end

 

解释:第二个页面的数据传递到第一个页面,

 

1),先讲第二个页面的值放到协议中        [_delegate getUserNameTitle:_tf1.text];

2),第一个页面实现协议并接收数据   

#pragma mark -实现协议,并接收传值

-(void)getUserNameTitle:(NSString *)userNameTitle{

 

    NSLog(@"%@",userNameTitle);

    _tf1.text=userNameTitle;

 

}

 

 

android页面之间的数据传递;

布局就一个输入框和按钮

 

第一个页面

package com2.example.wang.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText input_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        //初始化输入框
        input_text= (EditText)findViewById(R.id.index_et);
    }

    /**
     * 按钮点击事件
     * @param view
     */
    public void show(View view){
        switch (view.getId()){
            case R.id.index_btn:
                //获得输入框的值,将值传到下一页
                startActivity(new Intent(MainActivity.this,Main2Activity.class).putExtra("userNameTitle",input_text.getText().toString().trim()));

                break;
            case R.id.index_btn2:
                //获得输入框的值,将值传到下一页
                Intent intent =new Intent();
                intent.setClass(MainActivity.this,Main2Activity.class);
                intent.putExtra("userNameTitle",input_text.getText().toString().trim());
                startActivityForResult(intent, 2);

                break;
            default:
                break;
        }
    }

    /**
     * 获得第二个界面传递的值
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(resultCode==RESULT_OK&&requestCode==2){

            input_text.setText(data.getStringExtra("userNameTitle"));
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     *
     * @param menu
     * @return
     */

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

第二个页面

package com2.example.wang.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

public class Main2Activity extends AppCompatActivity {

    private EditText inputText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        //初始化组件
        inputText= (EditText)findViewById(R.id.et);

        //将传递的值设置到输入框中
       inputText.setText(getIntent().getStringExtra("userNameTitle"));
    }



    /**
     * 按钮点击事件
     * @param view
     */
    public void show(View view){
        switch (view.getId()){

            case R.id.btn:
                //获得输入框的值,将值传到下一页
                Intent intent =new Intent();
//                intent.setClass(Main2Activity.this, MainActivity.class);
                intent.putExtra("userNameTitle", inputText.getText().toString().trim());
            setResult(RESULT_OK,intent);
                finish();
                break;
            default:
                break;
        }
    }


}

 

android的跳转是通过Intent实现的,数据也可以直接放在Intent对象中传递

 

反向传值:

1,startActivityForResult

2,实现onActivityResult

3,第二个页面使用setResult带返回值跳转

4,综上 还是Android实现简单

 

0
2
分享到:
评论

相关推荐

    IOS代理方法反向传值

    "IOS代理方法反向传值"是一种常见的数据通信方式,特别是在多个视图控制器(UIViewController)之间进行数据交换时。这种方式利用了Objective-C的协议(Protocol)和代理(Delegate)机制,使得一个对象能够通过代理...

    在UIStoryboard中反向传值

    在iOS应用开发中,UIStoryboard是一种非常常用的工具,用于构建应用程序的用户界面。...在实际项目中,根据具体情况选择最适合的反向传值方式,能够更好地实现功能,同时保持代码的简洁和可扩展性。

    Block反向传值Demo

    Block反向传值在iOS开发中是一种常见的编程技巧,它允许我们传递数据或者回调到一个函数的调用者。在Objective-C或Swift中,Block是一种强大的闭包类型,可以捕获并存储其所在上下文中的变量,使得这些变量可以在...

    swift3.0三种反向传值方法

    在Swift 3.0中,反向传值(也称为回调或闭包)是实现异步操作、事件驱动编程和函数式编程风格的关键技术之一。下面我们将详细探讨三种主要的反向传值方法。 1. 函数参数作为闭包 在Swift中,你可以将一个函数或者...

    ios开发block反向传值

    在页面间的反向传值中,Block可以将数据传递从A页面到B页面,再由B页面返回到A页面,而无需通过中间对象或者全局变量。 一、Block反向传值的优势: 1. 简洁:Block语法简洁,代码可读性强,使得回调过程更加直观。 ...

    反向传值(协议代理)

    在iOS开发中,"反向传值(协议代理)"是一种常见的设计模式,它主要用于解决对象间通信的问题,尤其是在复杂的视图控制器之间传递数据或控制流。本文将深入探讨反向传值的概念、原理以及如何在实践中应用。 一、...

    Swift语言利用Closure闭包实现反向传值Demo

    在本Demo“Swift语言利用Closure闭包实现反向传值Demo”中,我们将深入探讨如何利用闭包在两个视图控制器之间实现数据的反向传递。 首先,理解闭包的基本概念。闭包本质上是一个函数,它可以访问并修改其外部作用域...

    ios-block反向传值.zip

    在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以...这个压缩包文件“block理解”可能包含了详细讲解Block反向传值的示例和实践,对于深入学习这一主题非常有帮助。

    ios-block逆传值页面间的.zip

    在这个名为"ios-block逆传值页面间的.zip"的资源中,我们主要关注的是如何使用Block来实现页面间的反向传值。Block是Objective-C和Swift中的一种强大的特性,它可以作为参数传递,也可以作为返回值。对于初学者来说...

    block反向传值

    在iOS开发中,数据传递是应用之间或页面之间交互的基础,尤其在导航控制器中的视图层级切换时。本文将深入探讨“block反向传值”这一技术,它允许我们将B界面的数据有效地回传到A界面,提升用户体验。我们将讨论...

    iOS委托反向传值

    在iOS开发中,数据传递是应用之间或同一应用内不同视图控制器间通信的重要手段。本文将详细探讨如何使用委托...在实际项目中,委托模式不仅用于反向传值,还常用于处理各种事件和回调,是iOS开发中的重要技巧。

    ios反向传值汇总

    在iOS开发中,"反向传值"是一个常见的需求,特别是在导航控制器的子控制器之间进行数据传递时。这里我们将深入探讨标题"ios反向传值汇总"所涵盖的三种主要方法:Block、代理(Delegate)以及广播(Notification)。...

    iOS 代理反向传值

    代理反向传值是这种设计模式的一个特殊应用,它允许子控制器或者下级组件将数据或者状态传递回父控制器或者上级组件。在这个过程中,通常不直接调用父控制器的方法,而是通过代理协议来实现信息的传递,增加了代码的...

    单例反向传值

    iOS传值,iOS单例反向传值,将B界面的值传到A界面。

    视图控制器反向传值

    视图控制器间的通信是实现功能的关键,而“反向传值”则是这种通信的一个特殊方式,尤其是在处理回调或者异步操作时。本篇将深入探讨视图控制器反向传值中的“block”使用以及如何通过单例模式来传递数据。 ### 一...

    iOS 多种传值方式

    本篇文章将详细探讨两种主要的传值方式:正向传值和反向传值,并通过具体实例解析它们的实现方法。 **一、正向传值** 1. **单例模式**: 单例是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在...

    iOS Notification反向传值

    在iOS开发中,数据传输是应用之间或同一应用内不同视图控制器间通信的重要环节。当我们需要从一个界面(B界面)向另一个已存在的界面(A界面)传递数据时,通常有多种方法,如代理模式、Block、KVO(Key-Value ...

    swift block(闭包) 属性反向传值和storyboard拆分(新)

    `swift block(闭包) 属性反向传值`这个概念指的是利用闭包来实现从子视图控制器向父视图控制器传递数据的一种方式。在实际应用中,我们可能会遇到这样的场景:子视图完成特定操作后,需要将结果返回给父视图。通过在...

Global site tag (gtag.js) - Google Analytics