iOS开发技巧-Swift版本: 1.UITextView不一样页面之间的传参

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


1.建立工程

1

2

建立完工程以后, 咱们去到 Main.Storyboard, 布局咱们须要的界面:
3swift

咱们能够利用 Xcode 的特性, 快速把一个 ViewController 交给 NavigationController 管理.markdown

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

这样子就能够快速的把一个 ViewController 交给 NavigationController 管理了, 示意图:
4函数

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


2.准备参数

在咱们开始实现的时候, 咱们须要作几个事情, 那就是绑定控件, 而且定义几个变量, 有人会问, 这几个变量有什么用?优化

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

ViewControllerOne.swiftui

// 1.关联 UITextView 控件
    @IBOutlet weak var TextViewOne: UITextView!

    // 2.声明一个 UITextView 类型的对象, 用来判断是不是当前正在编辑的 UITextView
    var currentEditingBox:UITextView?

ViewControllerTwo.swiftspa

// 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.编程思想

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


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

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

相关文章
相关标签/搜索