iOS開發技巧-Swift版本: 1.UITextView不同頁面之間的傳參
看完前面, 我們已經把 iOS 中的常用的控制元件都講完了, 現在我們該來看看怎麼去使用這些控制元件去開發我們的應用了, 現在讓我們來看看:
1.建立工程
建立完工程之後, 我們去到 Main.Storyboard, 佈局我們需要的介面:
我們可以利用 Xcode 的特性, 快速把一個 ViewController 交給 NavigationController 管理.
流程: 選中你想要得 ViewController -> 找到 Xcode 的 Editor 選單欄 -> 選中 Embed -> 點選 Navigation Controller.
這樣子就可以快速的把一個 ViewController 交給 NavigationController 管理了, 示意圖:
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.程式設計思想
說了那麼多東西都是假的, 開發最重要的核心就是程式設計思想, 一個好的程式設計思想可以決定軟體的質量和生命, 在這裡我做了一個思維導圖, 方便大家去理解:
好了, 這次就講到這裡, 下次我們再見~~
程式碼我會放到網上去, 供大家下載參考, 地址放在評論區