#26 實作 Table View | 模仿AppStore
實作表格的基本功能和定義 UITableViewDataSource 的相關 function
Published in
10 min readJan 9, 2023
這次作業模仿了AppStore的畫面,來練習Table View的應用~
⬇️ 成品預覽
✏️ 使用到的功能
- TableViewController
- Scroll View
- SegmentController,搭配switch-case及reloadData
✏️ 程式說明
- 先在Main.storyboard把畫面上所需的資訊先設計出來
➡️ 以AppStore中的App主頁面為主,以及大家都在用與免費App排行的次頁面,三個畫面皆使用TableViewController設計
➡️ App主頁面使用Static Cells,大家都在用與免費App排行則使用Dynamic Prototypes
➡️ 點選顯示全部的按鈕,進入下一頁
2. 準備要顯示的資料
先開一個新的file,將變數名稱寫在struct裡,再把資訊填入assay中
利用for-in迴圈將assay中的資訊一一帶入設計好的畫面中,可在這邊同步設定文字大小及顏色等
下方程式碼為最頂端的畫面,範例共有三個畫面
func setupTopPage(){
for i in 0...2{
nameLable[i].text = topAppInfo[i].name
nameLable[i].font = nameLable[i].font.withSize(26)
infoLable[i].text = topAppInfo[i].info
infoLable[i].textColor = .gray
infoLable[i].font = infoLable[i].font.withSize(20)
picImage[i].image = UIImage(named: topAppInfo[i].picName)
}
}
3. cell中的元件拉好IBOulet
4. 定義 Table view data source的相關內容
以下為 次頁面-大家都在用 的程式碼
- 這次畫面只使用1個Section,故 numberOfSection回傳1即可
- numberOfRowsInSection 利用.count,讀取array中的數量
- cellForRowAt,利用guard let 讀取tableView的內容,並用 as? 將tableView轉型為tableViewCell後,將內容存入cell
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return showMultiUseApp.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "\(multiUseTableViewCell.self)", for: indexPath) as? multiUseTableViewCell
else{
fatalError("dequeueReusableCell multiUseTableViewCell failed")
}
let multiUse = showMultiUseApp[indexPath.row]
cell.appNameLable.text = multiUse.name
cell.appNameLable.font.withSize(30)
cell.classInfoLable.text = multiUse.classInfo
cell.classInfoLable.textColor = .gray
cell.classInfoLable.font.withSize(15)
cell.iconImageView.image = UIImage(named: multiUse.picName)
cell.getBtn.setTitle("取得", for: .normal)
cell.getBtn.layer.cornerRadius = 18
cell.getBtn.backgroundColor = UIColor(cgColor: CGColor(red: 178/255, green: 179/255, blue: 181/255, alpha: 0.4))
return cell
}
- dequeueReusableCell 傳入 cell reuse id的方法有很多種,如上方為使用 string interpolation ” \(multiUseTableViewCell.self) ”,另一頁練習另一種方法使用extension,先在新的file中寫好extension,後續帶入就不怕打字錯誤囉!
extension UITableViewCell {
static var reuseIdentifier: String { "\(Self.self)" }
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let freeApp = freeRanks[indexPath.row]
let paidApp = paidRanks[indexPath.row]
switch rankSegmentControl.selectedSegmentIndex {
case 0:
let cell = tableView.dequeueReusableCell(withIdentifier: RankAppTableViewCell.reuseIdentifier, for: indexPath) as! RankAppTableViewCell
cell.rankImageView.image = UIImage(named: freeApp.picName)
cell.rankTitleLable.text = freeApp.name
cell.rankTitleLable.font = cell.rankTitleLable.font.withSize(20)
cell.rankSubtitleLable.text = freeApp.classInfo
cell.rankSubtitleLable.font = cell.rankSubtitleLable.font.withSize(15)
cell.rankSubtitleLable.textColor = .gray
cell.rankBtn.setTitle("取得", for: .normal)
cell.rankBtn.backgroundColor = UIColor(cgColor: CGColor(red: 178/255, green: 179/255, blue: 181/255, alpha: 0.4))
cell.rankBtn.layer.cornerRadius = 18
return cell
case 1:
let cell = tableView.dequeueReusableCell(withIdentifier: RankAppTableViewCell.reuseIdentifier, for: indexPath) as! RankAppTableViewCell
cell.rankImageView.image = UIImage(named: paidApp.picName)
cell.rankTitleLable.text = paidApp.name
cell.rankTitleLable.font = cell.rankTitleLable.font.withSize(20)
cell.rankSubtitleLable.text = paidApp.classInfo
cell.rankSubtitleLable.font = cell.rankSubtitleLable.font.withSize(15)
cell.rankSubtitleLable.textColor = .gray
return cell
default:
return UITableViewCell()
}
5. 程式啟動後,發現兩條不透明的線條,上下都有,要記得調整這個地方,將header/footer的estimate 設定為0,就可以拿掉了
🔆 GitHub
📝 參考來源