2015年6月28日 星期日

iOS筆記:UITableView

發生了多次的鬼打牆之後我終於實作了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.
螢幕快照 2015-06-04 上午12.52.04.png
在Xcode中可以選擇兩種樣式,Plain(一般)跟Group(群組)以下則是這兩種樣式的架構:
未命名.png
要在ViewController中實作TableView的一個重點就是必須要實作UITableViewDataSource與UITableViewDelegate這兩個Protocol.下圖的步驟是必須的,要建立DataSource跟Delegate.
螢幕快照 2015-06-10 上午12.57.02.png
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.
螢幕快照 2015-06-08 下午10.40.29.png
Segue的位置在兩個View中間,用來轉換不同的View.在轉換的同時也可以選擇要傳送哪些資料到下一個場景.當新增了一個View之後一定要記得進行下面這個步驟
螢幕快照 2015-06-08 下午11.11.43.png
要更改為自訂的class(要去新增.h跟.m檔的那種),預設的UIViewController只提供基本的模型,一個空白的view.我們在這邊要以它為基礎,並建立我們的class(UIViewController的子類別).
螢幕快照 2015-06-08 下午10.38.56.png


最左邊的箭頭為這個程市的進入點,如果少了那個箭頭編譯的時候就會發生錯誤.
產生“Segue"的方式是按住Ctrl鍵不放,點選Cell,並拖曳到要轉換到的view.
當一個Segue被觸發時,在轉換發生之前,Storyboard會開始運行啟動當下ViewController的prepareForSegue:sender,藉由這個方法可以傳遞想要在下一個View中顯示的資料.

在每個Segue中加上一個identifier,主要是用來辨識要從哪一個segue到畫面,當有很多視窗的時候這件事情就變成必須的,避免系統不知道你要在哪個視圖之間進行轉換.
螢幕快照 2015-06-08 下午11.31.50.png

- (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中刪掉.

沒有留言:

張貼留言