博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发技巧-Swift版本: 1.UITextView不同页面之间的传参
阅读量:5137 次
发布时间:2019-06-13

本文共 4806 字,大约阅读时间需要 16 分钟。

看完前面, 我们已经把 iOS 中的常用的控件都讲完了, 现在我们该来看看怎么去使用这些控件去开发我们的应用了, 现在让我们来看看:


1.创建工程

1

2

创建完工程之后, 我们去到 Main.Storyboard, 布局我们需要的界面:

3

我们可以利用 Xcode 的特性, 快速把一个 ViewController 交给 NavigationController 管理.

流程: 选中你想要得 ViewController -> 找到 Xcode 的 Editor 菜单栏 -> 选中 Embed -> 点击 Navigation Controller.

这样子就可以快速的把一个 ViewController 交给 NavigationController 管理了, 示意图:

4

PS: 这里面我们使用了 AutoLayout 来进行布局, 如果没有熟悉这套机制的朋友, 暂时使用你们之前布局的方式进行布局, 后面我会详细的去讲解 AutoLayout 这套机制.


2.准备参数

在我们开始实现的时候, 我们需要做几个事情, 那就是绑定控件, 并且定义几个变量, 有人会问, 这几个变量有什么用?

这几个变量其实就是用来进行判断, 并且赋值来使用的, 下面让我们来看看这几个变量:

ViewControllerOne.swift

// 1.关联 UITextView 控件    @IBOutlet weak var TextViewOne: UITextView!    // 2.声明一个 UITextView 类型的对象, 用来判断是否是当前正在编辑的 UITextView    var currentEditingBox:UITextView?

ViewControllerTwo.swift

// 1.关联 ViewControllerTwo 的 UITextView 控件    @IBOutlet weak var TextViewTwo: UITextView!    // 1.1声明一个回调函数    var saveCallBack: ((text:String)->Void)?    // 1.2声明一个字符串变量, 初始化为空    var inputText: String?    // 1.3声明两个用来判断 UITextView 有多少字数的 Int 变量, 初始化为0    var maxChar = 0    var number = 0

3.开始实现

首先我们要遵守 UITextView 的代理协议, 并且设置代理对象

ViewControllerOne.swift

class ViewController: UIViewController, UITextViewDelegate {
override func viewDidLoad() { super.viewDidLoad() // 3.设置 TextViewOne 的代理对象 TextViewOne.delegate = self }}

使用代理方法

// 4.调用 UITextView 的代理方法, 该方法在点击 UITextView 进行编辑时才会调用    func textViewDidBeginEditing(textView: UITextView) {        // 5.获取需要跳转的 Controller 所在的 Storyboard        let storyboard = UIStoryboard(name: "Main", bundle: nil)        // 6.获取需要跳转的 Controller 的 ID 以及绑定的类        let viewController = storyboard.instantiateViewControllerWithIdentifier("textViewTwo") as! ViewControllerTwo        // 7.设置 ViewControllerTwo 里的 inpuText 的内容为当前 TextView 的内容        viewController.inputText = textView.text        println("inputText = \(viewController.inputText)")        // 8.调用回调函数        viewController.saveCallBack = onTextSaved        println("saveCallBack = \(viewController.saveCallBack)")        // 9.设置 TextView 里所要限制的字数        viewController.maxChar = 14        // 10.设置当前处在编辑状态的 TextView        currentEditingBox = textView        println("currentEditingBox = \(currentEditingBox)")        println("TextViewOne = \(TextViewOne)")        // 11.进行页面跳转, 以及是否要使用动画效果        self.navigationController?.pushViewController(viewController, animated: true)    }

声明传参方法

// 12.声明保存文本内容的方法, 并且需要传入一个 String 类型的参数    func onTextSaved(text:String) {        println("text = \(text)")        // 13.判断如果当前编辑的 TextView 不为空, 那么就执行判断语句        if currentEditingBox != nil {            // 14.把输入完成的文本内容解包并且赋值到当前正在编辑的TextView            currentEditingBox!.text = text        }    }

ViewControllerTwo.swift

这里除了要遵守代理协议, 设置代理对象, 还需要多做一点事情

class ViewControllerTwo: UIViewController, UITextViewDelegate {
override func viewDidLoad() { super.viewDidLoad() // 2打印一下, 是否传参成功 println("inputText = \(inputText)") // 2.1让 TextViewTwo 成为第一响应者 TextViewTwo.becomeFirstResponder() // 2.2设置 TextViewTwo 的代理对象 TextViewTwo.delegate = self // 2.3判断 inputText 是否是 nil, 如果是nil的话, 就把内容赋给 TextViewTwo if inputText != nil { TextViewTwo.text = inputText } }}

绑定保存按钮, 并且实现传参方法

// 点击保存按钮    @IBAction func saveBarButtonItem(sender: UIBarButtonItem) {        // 3.取消 TextViewTwo 的第一响应者        TextViewTwo.resignFirstResponder()        // 3.1判断 saveCallBack 是否为 nil, 如果不为 nil, 就把内容解包并且传到 TextViewTwo        if saveCallBack != nil{            saveCallBack!(text: TextViewTwo.text)        }        println("传参到 contentCollectionView 的 TextView")        println("TextViewTwo.text = \(TextViewTwo.text)")        // 3.2当上面的操作完成时, 会调用下面的方法把页面关掉        self.navigationController?.popViewControllerAnimated(true)    }

绑定取消按钮, 并且实现取消保存文本的方法

// 点击取消按钮    @IBAction func cancelBarButtonItem(sender: UIBarButtonItem) {        // 4.取消 TextViewTwo 的第一响应者        TextViewTwo.resignFirstResponder()        // 4.1当上面的操作完成时, 会调用下面的方法把页面关掉        self.navigationController?.popViewControllerAnimated(true)    }

体验优化

// 自动清除从上一个界面带过来的内容, 保证用户是从0开始输入的    func textViewDidBeginEditing(textView: UITextView) {        if textView.text == "请输入内容:" {            textView.text = ""        }    }    // 设置 UITextView 输入的内容一旦大于或者等于限制的最大值, 就停止输入    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {        if range.location > maxChar {            var alert = UIAlertView(title: "提示", message: "字符个数不能大于\(maxChar)!", delegate: self, cancelButtonTitle: "确定")            alert.show()            return false        }        return true    }

4.编程思想

说了那么多东西都是假的, 开发最重要的核心就是编程思想, 一个好的编程思想可以决定软件的质量和生命, 在这里我做了一个思维导图, 方便大家去理解:

导图


好了, 这次就讲到这里, 下次我们再见~~

代码我会放到网上去, 供大家下载参考, 地址放在评论区

转载于:https://www.cnblogs.com/iOSCain/p/4529338.html

你可能感兴趣的文章
PE知识复习之PE的导入表
查看>>
POJ 3280 Cheapest Palindrome
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
Objective-C非正式协议与正式协议
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
SPOJ DQUERY D-query(主席树 区间不同数个数)
查看>>
八 Civil3d常用显示样式的编辑与创建 ----点标签样式2
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
生产阶段Webpack打包【基础打包】
查看>>
Cortex M3/M4 学习摘要(二)
查看>>
C#时间的味道——任时光匆匆我只在乎你
查看>>
(1)数据结构——线性表(数组)实现
查看>>
分享一个生成反遗忘复习计划的java程序
查看>>
SpringMyBatis解析2-SqlSessionFactoryBean
查看>>
按照excel文档中的内容在当前cad图纸中自动排布实体
查看>>
Winform开发框架之图表报表在线设计器2-图表-SNF.EasyQuery项目--SNF快速开发平台3.3-Spring.Net.Framework...
查看>>
C#基础第八天-作业-设计类-面向对象方式实现两个帐户之间转账
查看>>
洛谷 P3237 [HNOI2014]米特运输
查看>>
Attributes.Add用途与用法
查看>>
JavaScript面向对象初探——封装和继承
查看>>