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

說了那麼多東西都是假的, 開發最重要的核心就是編程思想, 一個好的編程思想能夠決定軟件的質量和生命, 在這裏我作了一個思惟導圖, 方便你們去理解:
導圖


好了, 此次就講到這裏, 下次咱們再見~~

代碼我會放到網上去, 供你們下載參考, 地址放在評論區

相關文章
相關標籤/搜索