zoukankan      html  css  js  c++  java
  • iOS开发技巧-Swift版本: 1.UITextView不同页面之间的传参

    看完前面, 我们已经把 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.编程思想

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


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

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

  • 相关阅读:
    linux使用rm-rf删除之文件恢复
    性能测试常见瓶颈分析及调优方法
    性能压测QPS 和 TPS区别
    Linux查看系统性能
    Python中split()和split(" ")的区别
    Python-标准库之functools
    Python-内置函数_@propery、@classmethod、@staticmethod详解
    Python-类的内置方法中__repr__和__str__的区别
    Python-标准库之运算符替代函数Operator
    Python-标准库之迭代器-itertools
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4529338.html
Copyright © 2011-2022 走看看