[ SWIFT ] - 史丹福 StandFord-CS193P-課程10-心得分享-20150827

[ SWIFT ] - 史丹福 StandFord-CS193P-課程10-心得分享-20150827
課程重點:UITableView
本次課程中Demo的範例為twittert查詢,因此先介紹一些在Demo中會用的UI

1.UITextField
說明:UITextField類似UILabel,但與UILabel不同的是UITextField可以進行編輯,當點選UITextField進行輸入,UITextField會成為頁面上FirstResponder(第一回應者),同時虛擬鍵盤會由底部滑出供使用者進行輸入。
當使用者輸入完畢時,需要讓本文成為目前的FirstResponder時,透過rsignFirstResponder便可關閉虛擬鍵盤。
例如:sender.resignFirstResponder關閉虛擬鍵盤。

becomeFirstResponder:指定某個對象成為當前頁面的FirstResponder。
resignFirstResponder:取消目前第一回應者身分,進而使虛擬鍵盤關閉。
UITextField是透過Delegate與UI進行交流。
 當編輯結束後會調用另一個代理方法textFieldDidEndEditing。
※UITextField最重要的Delegate方法:textFieldShouldReturn(返回Bool),適用於當使用者點選虛擬鍵盤上的Return時。

UITextField也可以作為一個UI的控制器,就像按鈕一樣,我們可以通過按鈕來觸發target和action,也可以通過一個UITextField來觸發一些action和target,只不過觸發的events和按鈕是不同的。

2.Keyboard鍵盤
2.1透過UITextInputTraits Protocol協議發送消息,來決定是否要出現鍵盤。
2.2透過inputAccessoryView:UIView:鍵盤彈出時此view會在鍵盤頂部,可在此添加按鈕或其他東西來增加鍵盤功能,如果要直接使用Keyboard就不用設定inputView。
※ 如果你預設使用Keyboard(沒有設定inputView),並且設定inputAccessoryView的時候;觀察 UIKeyboardWillShowNotication…etc.的通知, 系統會自動把inputAccessoryView的高度自動加上去
 鍵盤滑出時可能會遮擋頁面上的其他View,因此需要讓View配合鍵盤的位置進行調整透過theKeyboardAppeared中的NSNotification來取的userInfo中的信息進行相關處理。

下面是UITextField的一些其他屬性
例如設定當文字輸入過多時,配合TextField的寬度縮小字體(但不能無限制縮小,如果adjustsFontSizeToFitSidth被設置為true,那麼一定要設置minimumFontSize的尺寸。)

2.UITableView
說明:一個展示大量資料非常重要的Class,擁有ScrollView的功能。

※使用TableView的缺點:MVC中的view必須全部都是TableView,如果UI中還有其他物件就不能用TableViewController

下圖為動態與靜態的介紹
Plain Style組成介紹

表格的內容都是放在section中的,section的數量需要實現datasource中對應的代理方法,並且這個方法是required的
section也有header和footer,中間的部分就是tableCell
Grouped風格的table。
有無Section的對比,右邊有設定Sectiond:Japen與Mexcio
Cell類型介紹:
※UITableViewCell才可以創建Outlet和Action,而且自訂Cell在創建Outlet時不會自動設置class需手動設置。
※DataSource:負責提供cell資料。
Delegate:負責 cell如何呈現。

※TableView的運作方式為只處理設備可呈現的資料筆數,例如:有1000首歌曲,因iphone螢幕可呈現6筆,則TableView只會處理6筆(6個cell)
除了上述的cell種類外,也可以自己定義的格式:
透過新增檔案時選取TableViewController class,再指定class為自訂的class,便不需要手動去添加
TableView.delegate = self 這樣的代碼。

2.2TableView中重要的屬性設定:
style-Plain:可將資料分群成一組。grouped:。
cell的類型:static:表示cell是顯示在stroyBoard中所以可以增加Button或Label。
                    dynamic:使用plain,需建置一個protocoL在每種情況中cell都可以被選中,也可以改變cell的類型,例如:subtitle

在屬性檢查器中有幾個重要屬性設置如下:
style:可以設置Plain和Grouped
 content:可以設置動態和靜態

注意設置成static(靜態)的話,你的tableView就只能在storyboard中設置了,你可以向其中添加各種控件。
如果設置成Dynamic(動態),你可以在控制器的代碼中進行設置,通常動態的table使用Plain這種style。此時cell會被重復使用多次。
你可以編輯這些cell的格式,在試圖大綱中選中cell,此時屬性檢查器就切換到cell:

透過Accessory,可選擇cell右側的不同圖示,下圖為cell旁的圖示

如果選擇自訂cell則需要手動進行cell與tableviewcell的關聯(如下圖):


3.UITableView Protocols
3.1TableView需要2個Delegate:(1)DataSource:資料來源(2)Delegate:委派
※當新增class時設定的不是 TableViewController而是ViewController時,在建置關連時會只有Delegate。
※透過Ctrl+Shift來點選多層物件。

3.2當Cell是動態時,有3個必須手動設定的項目,設定後才可以建置Cell:
  3.2.1.設定Table有多少個Section
  3.2.2.設定Table有多少個Rows
  3.2.3.設定Cell的Class來顯示Cell

4.UITableViewCell
TableViewController會透過dataSource時設定row中cell的格式,設定的方式是透過UITableViewCell,UITableViewCell是二維格式,可設定Section與Cell的格式。


使用dequeued記錄一個可重複使用的cell格式。
※注意dequeueReusableCellWithIdentifier的回傳格式是AnyObject需要在轉為Cell,才可使用UITableViewCell的API


可以透過設置多個segue來達到同一行cell擁有多種不同效果

DataSource中的另外2個方法:
※注意:numberOfRowsInSection 沒有預設值


UIViewDelegate
說明:負責UIView如何顯示,透過 Delegate來監視table內部發生的異動。
例如:當TableView中某一行被點擊時,透過segue轉換畫面到其他view,可透過didSelectRowAtIndexPathf(回傳Section與Row)取得點選的行,另外 accessoryButtonTappedForRowWithIndexPath也可取的點擊的行。
下圖示範如何設定Cell與MVC的關聯,先點選Cell之後按住Ctrl鈕,將cell拖拉至TableViewController,此時連線中會出現 Segue在依需求設定Segue類型即可。

如果cell中有其他按鈕,例如:detail disclosure,也可以進行segue設定。
設置Segue的Identified
透過prepareForSegue進行Segue設置:
每一個case對應不同的identifier。
※注意這裡的sender是AnyObject類型的。
在prepare中要獲取一個sender的內容,需要把sender轉換成它原本的類型。
※prepare中不接受一個AnyObject類型的參數。
取得sender的內容後向Controller提供資料:

delegate會觀察tableView的動態,比如cell被點擊。在不適用segue的時候,可以使用這個代理方法來實現跳轉:
Delegate中有關will/did及willBegin設定
當view改變時,透過reladData重新載入資料進行view更新
使用reloadData這個方法來更新視圖,只能更新全部資料,但如果你只想針對改變的部分重新載入,則可使用reloadRowsAtIndexpaths:indexPaths給予指定範圍。
tableView中每一行的高度是必須指定的(透過estimatedRowHeight),或者通過AutoLayout也可以做到,而使用代理方法也可以設置row的高度。
除了代理方法,下面將展示一些tableView自己的方法:
例如:是否允許多行同時被選中


留言

熱門文章