课题

  1. 程序界面由3个文本编辑框和1个文本标签组成。
  2. 要求文本标签实时显示3个文本编辑框所输入的数字之和。
  3. 文本编辑框输入的不是合法数字时,将其值视为0。
  4. 3个文本编辑框的初值分别为1,2,3。

创建工程

打开 Xcode,File / New / Project..

在 New Project 向导的第1页,选 iOS / Single View App

在向导的第2页填上 Product Name: RxExample

在向导的第3页选择任意文件夹点击 Create 按钮创建工程

关闭所创建的工程

配置 Pods

在工程所在文件夹下创建 Podfile 文件,内容如下:

use_frameworks!

target 'RxExample' do
project 'RxExample'
pod 'RxSwift'
pod 'RxCocoa'
end

打开终端在工程所在文件夹下执行 pod install 命令。

$ cd RxExample
$ pod install
...
Installing RxCocoa (4.2.0)
Installing RxSwift (4.2.0)
...

用 Xcode 打开 RxExample.xcworkspace

配置 UI

打开 Main.storyboard 文件,在 View Controller Scene / View Controller / View 下面放置3个 Text Field 和1个 Label。

3个 Text Field 的初值分别设为1,2,3。

控件变量

打开 ViewController.swift 文件,在 ViewController 类中添加控件变量

@IBOutlet weak var tfNumber1: UITextField!
@IBOutlet weak var tfNumber2: UITextField!
@IBOutlet weak var tfNumber3: UITextField!
@IBOutlet weak var lblResult: UILabel!

使用 Assistant Editor 同时打开 Main.storyboard 文件,用 Control 键将控件变量挂到相应的控件上。

不使用 RxSwift 的传统解决方案

打开 ViewController.swift 文件,在 ViewController 类中添加事件方法

@IBAction func tfNumberChanged(_ sender: Any) {
let num1 = Int(tfNumber1.text!) ?? 0
let num2 = Int(tfNumber2.text!) ?? 0
let num3 = Int(tfNumber3.text!) ?? 0
lblResult.text = String(num1 + num2 + num3)
}

使用 Assistant Editor 同时打开 Main.storyboard 文件,用 Control 键将 tfNumberChanged 方法挂到3个 Text Field 的 Editing Changed 事件上。

在 ViewController 类的 viewDidLoad 方法中添加事件方法的调用

tfNumberChanged(self)

使用 RxSwift 的解决方案

在 ViewController.swift 文件中添加 RxSwift 和 RxCocoa 的引用,然后在 ViewController 类中添加 DisposeBag 类型的实例。

import RxSwift
import RxCocoa class ViewController {
// ...
let disposeBag = DisposeBag()
// ...
}

在 ViewController 类的 viewDidLoad 方法中添加以下代码

Observable.combineLatest(tfNumber1.rx.text.orEmpty, tfNumber2.rx.text.orEmpty, tfNumber3.rx.text.orEmpty) { num1, num2, num3 -> Int in
(Int(num1) ?? 0) + (Int(num2) ?? 0) + (Int(num3) ?? 0) }
.map { String($0) }
.bind(to: lblResult.rx.text)
.disposed(by: disposeBag)

ReactiveX 学习笔记(19)使用 RxSwift + RxCocoa 进行 GUI 编程的更多相关文章

  1. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  2. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  3. SQL反模式学习笔记19 使用*号,隐式的列

    目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...

  4. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  5. springmvc学习笔记(19)-RESTful支持

    springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...

  6. [原创]java WEB学习笔记19:初识MVC 设计模式:查询,删除 练习(理解思想),小结 ,问题

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. ‎Cocos2d-x 学习笔记(19) Control Invocation

    [Cocos2d-x 学习笔记 目录链接] 1. 简介 control为其子类提供了touch回调函数,当子类触发EventType相关事件时,会调用相关的回调函数. control对象接收到的事件类 ...

  8. 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...

  9. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. vue 定义方法执行方法 获取数据 改变数据 执行方法传值 以及事件对象

    <template> <div id="app"> <!-- <img v-bind:src='url' /> <img :src= ...

  2. Unreal Engine 4 Smear Frame效果的实现与分析

    转自:http://www.52vr.com/article-868-1.html 这篇文章介绍了类似守望先锋中的帧转移模糊(Smear Frame)效果.   该效果由Jan Kaluza实现,本博 ...

  3. Javascript-关于null、undefined、空字符串的区分

    一.分别判断 var a=null; //var a=undefined; //var a=''; //var a='DD'; if(!a&&typeof a == 'object') ...

  4. APIO 2018选圆圈

    #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...

  5. python2.7中不同类型之间的比大小

    可以看到,字符串为空的时候也比数字类型大,这是因为python2.7中按照如下规则进行比较: 1.任何两个对象都可以比较. 2.相同类型的对象(实例),如果是数字型(int/float/long/co ...

  6. Java 文件类 File

    1.File 类 1.File 类 1.1.构造方法 文件的 抽象路径名(操作系统无关) 构造方法 格式 说明 File(String filename) 把文件路径名字符串转换为“抽象路径名”,用来 ...

  7. java 怎样向一个已存在的文件中添加内容

    如果想向某个文件最后添加内容,可使用FileWriter fw = new FileWriter("log.txt",true);在创建FileWriter时加个true就可以了. ...

  8. django-media隐射

    需要再主url.py中设置 from django.urls import include, path from django.conf.urls.static import static from ...

  9. uva-141-枚举

    旋转过程的下标变化,画个2x2的表格,模拟就可以出来了 #include <string> #include<iostream> #include<map> #in ...

  10. java与xml转换 -- XStreamAlias

    @XStreamAlias 1.特点 简化的API; 无映射文件; 高性能,低内存占用; 整洁的XML; 不需要修改对象;支持内部私有字段,不需要setter/getter方法 提供序列化接口; 自定 ...