1. 程式人生 > >iOS開發技巧-Swift版本: 1.UITextView不同頁面之間的傳參

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.程式設計思想

說了那麼多東西都是假的, 開發最重要的核心就是程式設計思想, 一個好的程式設計思想可以決定軟體的質量和生命, 在這裡我做了一個思維導圖, 方便大家去理解:
導圖

好了, 這次就講到這裡, 下次我們再見~~

程式碼我會放到網上去, 供大家下載參考, 地址放在評論區