顯示具有 UITableView 標籤的文章。 顯示所有文章
顯示具有 UITableView 標籤的文章。 顯示所有文章

2019年9月9日 星期一

[iOS] UITableView - 基礎2

透過基礎1中我們學會了如何使用UITableView。

若是還沒看基礎1,可以透過以下連結前往

基礎1


接下來我們可以使用UITableViewDelegate來取得使用者點選了哪個Cell。

我們先建立簡單的UITableView,可以透過基礎1的結果繼續往下做。

接著在我們的ViewController,透過extension來實作UITableViewDelegate



此時你會發現Xcode並沒有任何變化,因為UITableViewDelegate這個Protocol,所有的func都是可選的,因此就算你一個func都沒有實作,它也認為你已經實作了此Procotol。

但是我們會需要知道使用者點選了哪個Cell,我們可以在Xcode輸入以下的文字

tableviewdid

接著靠Xcode的自動完成功能,選擇我們所需要的func


tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

為UITableViewDelegate Protocol的其中一個func,當使用者點選了任何一個Cell時,將會觸發,會回傳兩個值,分別是你所點選的tableView是何者,以及所點選的indexPath,接著我們將func寫入以下程式碼,使用者點選時會印製log出來。



最後不要忘記在viewDidLoad指定delegate 哦,以下為完整程式碼。



你可以試著執行看看程式,點選其中一個Cell的時候,應該會有訊息印製出來哦。


[iOS] UITableView - 基礎1

UITableView,是一種表格化顯示的View,可以從各式各樣的App當中看見它的身影,是十分常見的一種View。

這邊來介紹最基本的使用方式,首先先開啟一個新的專案,並且於StoryBoard中,加入UITableView,並且設置簡單的Constraint,將UITableView佔滿UIViewController。


接著,我們建置IBoutlet,將UITableView與我們的UIViewController class做關聯,以下我們命名為tableView。


下一步,如果要使用UITableView,我們必須實作UITableViewDataSource這個Protocol。

因此我們加入extension,讓我們的ViewController去實作UITableViewDataSource,此時你會發現Xcode自動發出警告,若是要實作這個Protocol,必須實作一些方法


按下Fix後,XCode會自動幫你產生所需要的程式碼。

必須要實作兩個方法。

tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

你必須告訴tableView,你要顯示幾個Row

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

你必須告訴tableView,每個Row所顯示的Cell

接著我們先切回StoryBoard,並且搜尋UITableViewCell,將UITableViewCell拖曳到UITableView裡面。


接著我們選擇這個Cell,然後於右邊的屬性配置區,輸入這個Cell的Identifier,我們將它命名成『MyCell』。


下一步我們可以回到程式碼,將不足的部分補齊,首先我們告訴TableView,我們需要10個Row。

接著我們將下一個程式碼也補齊,我們透過剛才於Storyboard設置的Identifier來取得Cell,並且設置顯示的文字。

最後於viewDidLoad,將tableView的dataSource設置為我們的ViewController,以下是完整的程式碼。

以及執行結果。

以上就是TableView,最基本的用法,要使用就必須實作UITableViewDataSource這個Protocol。

接下來可以看基礎2學習如何使用UITableViewDelegate來捕捉使用者點選了哪個Cell哦。

基礎2

2014年12月23日 星期二

[Objective-C] 利用NSData dataWithContentsOfURL取得JSON文件

JSON是一種輕量級的資料交換格式,我們時常會需要從網路下載並解析JSON文件有許多方式可以完成此目標,在此說明其中一種。

網路上有許多JSON文件可以免費利用,這個範例是使用台北市政府資料開放平台提供JSON。

臺北市健康服務中心
資料集描述:各區健康服務中心
主要欄位說明:健康服務中心名稱、網址、行政區、地址、電話

假設我們要取出名稱及地址,顯示在TableView之中。

宣告一個靜態字串變數,內容為JSON文件內容的網址,以利未來使用。
static NSString * const KJSON = @"http://data.taipei.gov.tw/opendata/apply/json/RkRDNjk0QzUtNzdGRC00ODFCLUJBNDktNEJCMUVCMDc3ODFE";

在TableView之中,加入一個Bar Button Item並設定一個Action名稱為getJsonAction











- (IBAction)getJsonAction:(UIBarButtonItem *)sender {}

在設定一個全域型的NSMutableArray來儲存JSON
NSMutableArray *jsondata;
當我們按下此按鈕後,就下載JSON文件並顯示於TableView之中
NSURL *url = [NSURL URLWithString:KJSON];
//設定URL路徑
NSError *error;
//創建錯誤訊息物件
使用NSData中的類別方法
+ (instancetype)dataWithContentsOfURL:(NSURL *)aURL options:(NSDataReadingOptions)mask error:(NSError **)errorPtr
此方法是同步傳輸,如果網路狀態很差的話,會給使用者很差的體驗,因為會卡住整個程式很久。

參數說明
dataWithContentsOfURL: 丟入一個NSURL

options:設定NSDataReadingOptions,有三種狀態可以選
NSDataReadingMappedIfSafe 會儲存到虛擬記憶體中,如果安全且可行 
NSDataReadingUncached 只會讀取,不會儲存到記憶體中,較快速
NSDataReadingMappedAlways 不管安不安全,只要能存,就存到記憶體中
error:錯誤訊息
NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];
//我們丟入URL,狀態選擇只讀不存 在加入判斷式,確定無誤在存入jsondata之中
利用NSJSONSerialization的類別方法
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error
參數說明
data:丟入要轉換的data物件
options:NSJSONReadingOptions
NSJSONReadingMutableContainers 回傳的JSON之中的Dictionary或Array,都是可變(mutable)的
NSJSONReadingMutableLeaves 回傳的JSON之中的子節點若是String,則會回傳可變(mutable)的
NSJSONReadingAllowFragmentsJSON 頂層元素如果不是Array或Dictionary,也能解析此JSON
最後在把TableView的DataSource設定即可
執行結果



2014年12月3日 星期三

[Objective-C] UITableview UITableViewCell 設定圖片也有 線條 的做法

一般在TableView的Cell設定圖片,預設的線條會不見


利用StoryBord可以設定讓圖片與線條共存,點選TableView裡的Cell,並且設定Separator


預設值是Default Insets,點開下來式選單選擇Custom Insets


將Left的值改為0



如此一來線條就會與圖片並存了



如果要用程式碼來達到相同的效果的話

最直覺的做法可能會想把整個TableView裡面所有的Cell中的Separator的Left值都設成0

那麼你可能會加入這行程式碼
    
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];

可是效果卻不是特別的好,沒有圖片的線條會到底

因此應該在你加入Cell時才去將Left的值改為0才會正常

如此一來,這樣可以透過程式碼達到你想要的效果