iOS UI-界面传值(三种方法)
#import <Foundation/Foundation.h> @interface DataModel : NSObject @property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address; @end #import "DataModel.h" @implementation DataModel @end
#import <UIKit/UIKit.h>
@class DataModel;
//设置协议
@protocol PassValueDelegate <NSObject>
- (void) passValueFromFirstVCToSecondVC:(DataModel *) dataModel;
@end @interface FirstViewController : UIViewController
//设置代理
@property (nonatomic, strong) id<PassValueDelegate> delegate;
//设置通知传值接受者
@property (nonatomic, strong) DataModel *firstNOtificationModel;
//设置代理传值传值者
@property (nonatomic, strong) DataModel *firstDelegateModel; @end #import "FirstViewController.h"
#import "DataModel.h"
#import "SecondViewController.h" @interface FirstViewController ()
//设置接收通知传值的标签
@property (nonatomic, strong)UILabel *label;
//设置接收block传值的标签
@property (nonatomic, strong)UILabel *lblBlock; @end @implementation FirstViewController - (void)viewDidLoad {
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor orangeColor]]; [self createButtonAndLabel]; //创建观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveValue:) name:@"passValueFromSecondVCToFirstVC" object:nil];
} #pragma mark - 创建按钮和标签
- (void)createButtonAndLabel
{
//创建标签
self.label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
[self.label setBackgroundColor:[UIColor redColor]];
self.label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:self.label]; //创建标签
self.lblBlock = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
[self.lblBlock setBackgroundColor:[UIColor redColor]];
self.lblBlock.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:self.lblBlock]; //创建按钮
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(, , , )];
[btn setBackgroundColor:[UIColor blackColor]];
[btn setTitle:@"goToNextView" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(goToNextView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
} #pragma mark - 观察者接收值关联方法
- (void)receiveValue:(NSNotification *)notification
{
if ([notification.object isKindOfClass:[DataModel class]]) {
self.firstNOtificationModel = notification.object;
self.label.text = [NSString stringWithFormat:@"name:%@ address:%@",self.firstNOtificationModel.name,self.firstNOtificationModel.address];
}
}
#pragma mark - 代理传值、block接收值
//按钮关联方法
- (void)goToNextView
{
SecondViewController *secondVC = [[SecondViewController alloc] init];
[self presentViewController:secondVC animated:YES completion:nil]; [secondVC setBlock:^(DataModel *dataModel){
self.lblBlock.text = [NSString stringWithFormat:@"name:%@ address:%@",dataModel.name,dataModel.address];
}]; self.delegate = secondVC;
if ([self.delegate respondsToSelector:@selector(passValueFromFirstVCToSecondVC:)]) {
[self.delegate performSelector:@selector(passValueFromFirstVCToSecondVC:) withObject:self.firstDelegateModel];
}
} #pragma mark - 懒加载
- (DataModel *)firstDelegateModel
{
if (!_firstDelegateModel) {
_firstDelegateModel = [[DataModel alloc] init];
_firstDelegateModel.name = @"GuYu";
_firstDelegateModel.address = @"AnHui";
}
return _firstDelegateModel;
} @end
#import <UIKit/UIKit.h>
#import "FirstViewController.h"
@class DataModel;
//定义block类型
typedef void(^Block)(DataModel *dataModel); @interface SecondViewController : UIViewController <PassValueDelegate>
//通知传值的传值者
@property (nonatomic, strong) DataModel *secondNotificationModel;
//代理传值的接受者
@property (nonatomic, strong) DataModel *secondDelegateModel;
//block的接受者
@property (nonatomic, strong) Block block; @end #import "SecondViewController.h"
#import "DataModel.h" @interface SecondViewController () @property (strong, nonatomic) UILabel *label; @end @implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor groupTableViewBackgroundColor]]; [self createButtonAndLabel];
}
#pragma mark - 创建标签和按钮
- (void)createButtonAndLabel
{
//创建标签
self.label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
[self.label setBackgroundColor:[UIColor redColor]];
self.label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:self.label]; //创建按钮
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(, , , )];
[btn setBackgroundColor:[UIColor blackColor]];
[btn setTitle:@"goToBack" forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(goToBack) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn]; }
#pragma mark - block传值、通知传值
//按钮关联方法
- (void)goToBack
{
[self dismissViewControllerAnimated:YES completion:nil]; //block传值
self.block(self.secondNotificationModel); //通知传值
[[NSNotificationCenter defaultCenter] postNotificationName:@"passValueFromSecondVCToFirstVC" object:self.secondNotificationModel];
} #pragma mark - 代理协议方法
- (void)passValueFromFirstVCToSecondVC:(DataModel *)dataModel
{
self.secondDelegateModel = dataModel;
self.label.text = [NSString stringWithFormat:@"name:%@ address:%@",self.secondDelegateModel.name,self.secondDelegateModel.address];
} #pragma mark - 懒加载
//初始化_secondNotificationModel
- (DataModel *)secondNotificationModel
{
if (!_secondNotificationModel) {
_secondNotificationModel = [[DataModel alloc] init];
_secondNotificationModel.name = @"Bowen";
_secondNotificationModel.address = @"China";
}
return _secondNotificationModel;
}
//初始化self.block
- (void)setBlock:(Block)block
{
_block = block;
} @end
iOS UI-界面传值(三种方法)的更多相关文章
- iOS拨打电话(三种方法)
iOS拨打电话(三种方法) 查了很多地方的关于iOS程序拨打电话,大都不全,今天我总结了三种方法,各有不同,拿来给大家分享,希望给大家有所帮助 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯 ...
- Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...
- 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!
附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...
- iOS 处理缓存的三种方法
缓存处理是个相当头疼的事情,要根据需要综合应用不同的策略.总的来说有以下几种情况: 1.URL缓存,例如社交应用的帖子浏览,要在viewDidAppear:里面进行URL缓存.简单来说就是用NSURL ...
- iOS之加密的三种方法
//需要导入 #import <CommonCrypto/CommonCryptor.h> ==============MD5加密============ NSString *str ...
- 更新UI界面的四种方法
一.runOnUiThread(new Runnable()): 二.Handler的sendMessage()系列: 三.Handler的post(): 四.View的post():
- Python 开发GUI之UI界面的三种引入形式
[纯手工代码] # -*- coding: utf-8 -*- # Author:Jack LEE # FileName:main # CreatedDate: 2020/9/17 # 手写代码的基础 ...
- iOS 拨打电话三种方法
小弟查了很多地方的关于iOS程序拨打电话,大都不全,今天我总结了三种方法,各有不同,拿来给大家分享,希望给大家有所帮助1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出 ...
- MVC控制器向View视图传值的三种方法
首先创建一个MVC的项目,其中需要一个控制器(TestController),三个视图(index,edit,detail) 1.项目结构如下:
- React Router v4 页面传值的三种方法
传值方法 1.props.params 使用React router定义路由时,我们可以给指定一个path,然后指定通配符可以携带参数到指定的path: <Route path='/user/: ...
随机推荐
- web.xml配置详解之listener
web.xml配置详解之listener 定义 <listener> <listener-class>nc.xyzq.listener.WebServicePublishLis ...
- 03: KindEditor (HTML可视化编辑器)
目录: 1.1 kindEditor常用配置参数 1.2 kindEditor下载与文件说明 1.3 kindEditor实现上传图片.文件.及文件空间管理 1.1 kindEditor常用配置参数返 ...
- go learning
1. vim-go https://github.com/fatih/vim-go-tutorial curl -fLo ~/.vim/autoload/plug.vim --create-dirs ...
- centos 安装 ffmpeg
使用yum方式安装ffmpeg: 先安装Nux Dextop仓库: Nux Dextop库依赖于EPEL库,所有要先安装EPEL库(需要管理员权限). 如果安装过则跳过. $ su root $ yu ...
- C#中值和引用
c#中有两种基本类型,它们分别是值类型和引用类型:而每种类型都可以细分为如下类型: ps:1.基本类型是值类型 2.类.接口.委托都是引用类型
- 【前端】Vue.js实现实例搜索应用
实例搜索应用 实现效果: 实现代码与注释: <!DOCTYPE html> <html> <head> <title>实例搜索</title> ...
- HDU 6171 Admiral(双向BFS+队列)题解
思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现 ...
- ubuntu 把软件源修改为国内源和更新
1. 备份原始文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 2. 修改文件并添加国内源 vi /etc/apt/sourc ...
- 【第十五章】 springboot + pojo默认值设置
我们有时需要给POJO设置默认值 pojo设置(推荐) 1.User package com.xxx.firstboot.domain; import lombok.Getter; import lo ...
- mybatis generator插件系列--lombok插件 (减少百分之九十bean代码)
经常使用mybatis generator生成代码的你 有没有因为生成的getter/setter而烦恼呢? 有没有生成后又手动加toString/hashCode/Equals方法呢? 有没有改一个 ...