發生了多次的鬼打牆之後我終於實作了UITableView + Segue.
TableView在iOS中是很常使用的元件,在iOS的開發文件中可以發現UITableView是ScrollView的Subclass.在表格中每一列呈現資料的稱為Cell.iOS所提供的表格每一列只能儲存一個Cell,儲存格的產生方式有Dynamic跟Static.
Dynamic : Be loaded by some external data, by using datasource protocol.
Static : They are fix by tour design.
在Xcode中可以選擇兩種樣式,Plain(一般)跟Group(群組)以下則是這兩種樣式的架構:
要在ViewController中實作TableView的一個重點就是必須要實作UITableViewDataSource與UITableViewDelegate這兩個Protocol.下圖的步驟是必須的,要建立DataSource跟Delegate.
UITableViewDataSource 資料與表格試圖的連結 (Provides the data what is displayed inside the cells.)
#下兩個方法是 UITableViewDataSource 中屬於必須實作的方法.
- ( NSInteger ) tableView :( UITableView * ) tableView numberOfRowsInSection :( NSInteger ) section
{
return [ cities count ] ; #回傳陣列中元素的數量 .
}
- ( UITableViewCell * ) tableView :( UITableView * ) tableView cellForRowAtIndexPath :( NSIndexPath * ) indexPath
{
#這個方法在每次TableView要顯示出來時會被呼叫.
NSString * Cityidentifier = @ "CityTableCell" ;
#上面為自訂Cell中的identifier
CityTableViewCell * cell = [ tableView dequeueReusableCellWithIdentifier :Cityidentifier ] ;
#檢查queue中有無可以重複使用的cell,沒有的話就在下面的判斷式中新增.
if ( cell == nil ) {
cell = [[ CityTableViewCell alloc ] initWithStyle :UITableViewCellStyleDefault reuseIdentifier :Cityidentifier ] ;
}
. . .
return cell ;
}
UITableViewDelegate 負責UITableView的外觀部分 (Used to control how the table is displayed.)
UITableViewDelegate method sent when row is selected! (沒有必須實作)
- ( void ) tableView :( UITableView * ) sender didSelectRowAtIndexPath :( NSIndexPath * ) path {
 # //go do something based on information about my Model!
# //corresponding to indexPath.row in indexPath.section
}
Navigation Controller
下圖為Navigation 的概念, Navigation Controller第一個指導的view是Rootviewcontroller.
Segue的位置在兩個View中間,用來轉換不同的View.在轉換的同時也可以選擇要傳送哪些資料到下一個場景.當新增了一個View之後一定要記得進行下面這個步驟
要更改為自訂的class(要去新增.h跟.m檔的那種),預設的UIViewController只提供基本的模型,一個空白的view.我們在這邊要以它為基礎,並建立我們的class(UIViewController的子類別).
最左邊的箭頭為這個程市的進入點,如果少了那個箭頭編譯的時候就會發生錯誤.
產生“Segue"的方式是按住Ctrl鍵不放,點選Cell,並拖曳到要轉換到的view.
當一個Segue被觸發時,在轉換發生之前,Storyboard會開始運行啟動當下ViewController的prepareForSegue:sender,藉由這個方法可以傳遞想要在下一個View中顯示的資料.
在每個Segue中加上一個identifier,主要是用來辨識要從哪一個segue到畫面,當有很多視窗的時候這件事情就變成必須的,避免系統不知道你要在哪個視圖之間進行轉換.
- ( void ) prepareForSegue :( UIStoryboardSegue * ) segue sender :( id ) sender
{
if ( [ segue . identifier isEqualToString : @ "CityDetail" ] ) {
NSIndexPath * indexpath = [ self . tableView indexPathForSelectedRow ] ; #取得被選擇表格的資訊 .
CityDetailViewController * detailcity = segue . destinationViewController ;
. . .
}
}
常見問題有Class忘記設定或是IBoutlet名字打錯改過名字後忘記在Interface Builder中刪掉.
沒有留言:
張貼留言