Storyboards在iOS5就已經添加進來了,被開發者們指點了不少年了,現在他也添加了很多的新的功能。Apple如今是鼓勵開發者們使用Storyboards來進行頁面的開發的,雖然一直尚未徹底那些代碼寫界面的所接受,可是我覺的這將會是以趨勢。ios
原文連接git
再開始以前我覺的你能夠先去看下這個視頻,這是WWDC2015上關於這部分的介紹。這個視屏字幕是翻譯成中文的。視頻連接swift
項目初始地址ide
若是你已經看過了上邊的那個視頻,那麼你就會知道Storyboard references
這個功能有多麼棒。模塊化
若是你曾經使用 interface builder
建立過一個複雜、界面很是多的應用,你就會明白最後那些Storyboards
文件變的有多大。他會迅速變的沒法管理,阻礙你的進度。自從引入 Storyboard
以來,實際上是能夠把你的應用的不一樣模塊切開到不一樣的 Storyboard
中的。在過去,這要手動建立多個 Storyboard
文件,而且要寫大量的代碼。佈局
爲了解決這個問題,在 iOS 9 中蘋果介紹了 Storyboard References
這個概念。Storyboard References
容許你從 segue
中引用其餘 storyboard
中的 viewController
。這意味中你能夠保持不一樣功能模塊化,同時 Storyboard
的體積變小並易與管理。不只容易理解了,和團隊一塊兒工做時,合併(工做成果)也變的簡單了。動畫
打開咱們的項目來建立你的第一個storyboard reference
,打開Main.storyboard
,選擇除了tar bar controller
以外的全部視圖控制器,而後選擇Editor\Refactor to storyboard
And 輸入Checklists.storyboard
做爲這個新的故事版的名稱。而後點擊存儲。ui
你的新的故事版的樣子應該是下邊這個樣子: spa
而你的原來的故事版將會是這個樣子:.net
接下來咱們在Main.storyboard
中選擇名字是ChecklistsNavigationController
的references
在屬性面板中刪除Referenced ID
裏的值。
修改以後就回變成下邊的樣子
打開你的Checklists.storyboard
選擇Checklists Navigation Controller
在屬性面板中選中Is Initial View Controller
。
咱們也能夠從Object Library
中拖進來一個Storyboard reference
控件。
在咱們項目中的ChecklistDetail.storyboard
中選擇Checklist Detail View Controller
,從Object Library
拖出一個View
放在secne dock
你會不會嚇一跳。但是你會想,額。咱們怎麼去使用它呢。咱們先來一個簡單的使用吧。
選中這個View
在屬性欄中將背景顏色設置爲#FFFAE8
從ChecklistItemCell
拖出Ctrl-drag
到你的這個view中,選擇selectBackgroundView
而後你運行你的項目,點擊任何cell
咱們常常會想建立一個只須要在特定條件下才顯示的view
。咱們可使用scene dock
來方便的實現這一點。
咱們仍然在ChecklistDetail.storyboard
中拖進來一個 View
在scene dock
中,將剛纔的那個設置過背景顏色的View
的寬高設置爲321
;128
。
在這個新的View
中拖進來一個label
和text View
。設置label
的文字是notes
,顏色設置爲#BB991E
:
將 textView
的屬性中editable
和selectable
不要勾選。就像下邊的這個樣子:
接下來咱們在代碼中將新添加進來的view
和這個textView
作一個關聯。
在ChecklistDetailViewController.swift
中添加兩個方法,一個是用來顯示新添加進來的View
另一個天然是移除了。
func addNotesViewToCell(cell:ChecklistItemTableViewCell){ notesVIew.heightAnchor.constraintEqualToConstant(notesViewHeight).active = true notesVIew.clipsToBounds = true cell.stackView.addArrangedSubview(notesVIew) } func removeNotesView(){ if let stackview = notesVIew.superview as? UIStackView{ stackview.removeArrangedSubview(notesVIew) notesVIew.removeFromSuperview() } }
上邊的方法能夠確保自動佈局定義筆記的高度,而後將其添加到對應的單元格中,他還設置了clipsToBounds
爲true,以防止文本視圖從cell
中外溢。
接下來就是使用這兩個方法了。在ChecklistDetailViewController.swift
中完成下邊的方法。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //1 guard let cell = tableView.cellForRowAtIndexPath(indexPath) as? ChecklistItemTableViewCell else {return} //2調用這個方法來以動畫更改單元格的高度 tableView.beginUpdates() //3 若是cell的stackView已經包含了它則刪除,若是沒有則添加 if cell.stackView.arrangedSubviews.contains(notesVIew){ removeNotesView() }else{ addNotesViewToCell(cell) notesTextView.text = checklist.items[indexPath.row].notes } //5 最後來條用這個方法來提交更改。 tableView.endUpdates() }
接下里運行你的程序就會看到下邊的效果。
在故事版中給Checklist Detail View Controller
拖進來兩個bar button item
放在navigation bar
的右邊,給其中一個的圖片設置爲AddButtonicon
從add
button拖拽出一天線到add item navigation controller
從彈出來的菜單中選擇present modally
。這樣的話咱們點擊add button
則會彈出一個新的界面。
接下來咱們須要給咱們彈出的界面添加消失的功能。
在checklistDetail.storyboard
中選擇add item view controller
,從Cancel
按鈕中拖出一條線到Exit
,從彈出的菜單中選擇cancelToChecklistDetailViewController
一樣的方法給save
按鈕添加saveToChecklistDetailViewController
運行一下程序來看下效果吧。
咱們在最後的最後來添加刪除cell
的功能。
在ChecklistDetailViewController.swift
中完成下邊的方法。
viewDidLoad中添加
navigationItem.rightBarButtonItems![1] = editButtonItem()
重寫下邊的方法
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete{ removeNotesView() checklist.items.removeAtIndex(indexPath.row) tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } }