본문 바로가기

ComputerScience/ios App(Storyboard)

ios - 13 Custom Cell

728x90

1 Custom Cell

- TableViewCell을 상속받아서 아래 그림처럼 나만의 셀을 정의해보자

- 이전 포스트에 이어서 작업을 진행한다.

- 가장먼저 커스텀 셀 class를 정의한다.

- UITableViewCell을 상속하며 한개의 이미지와 두개의 레이블을 갖는다.

class ListCell: UITableViewCell {
    @IBOutlet weak var imgView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var bountyLabel: UILabel!
}

- 셀클릭 -> identity inspector -> custom class에 ListCell 연결

2 Cell 크기 조절

- 셀의 크기를 조정할 수 있다.

- table View에서도 셀의 크기를 조정해주자.

3 cell에 컴포넌트 넣기

- 이래처럼 이미지와 레이블을 넣고 class의 property들과 연결시킨다.

- cell과 outlet이 잘 연결되었는지 connection inspector에서 확인한다.

- 추가로 image View와 label에 입맛에 맞게 여러 contraints를 적용시켜보자.

- control키를 누른채로 imageview에서 imageview로 마우스를 드래그한다.

- aspect ratio를 적용하고 비율을 7대 10으로 맞춰보자.

4 리스트에 들어갈 데이터 준비

- 배열로 데이터를 정의한다.

import UIKit

class BountyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    let nameList = ["brook", "chopper", "franky", "luffy", "nami", "robin", "sanji", "zoro"]
    let bountyList = [33000000, 50, 44000000, 300000000, 16000000, 80000000, 77000000, 120000000]
   
    .....
    .....
    .....
    
}

class ListCell: UITableViewCell {
    @IBOutlet weak var imgView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var bountyLabel: UILabel!

}

- 필요한 이미지를 Assets.xcassets에 넣는다.

5 프로토콜 손보기

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return nameList.count
 }

- 배열의 원소 수만큼 셀을 그릴 것이다.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? ListCell else {
            return UITableViewCell()
        }
        let img = UIImage(named: "\(nameList[indexPath.row]).jpg")
        cell.imgView.image = img
        cell.nameLabel.text = nameList[indexPath.row]
        cell.bountyLabel.text = "\(bountyList[indexPath.row])"
        return cell
    }

- cell을 ListCell 타입으로 안전하게 casting하고

- ListCell과 outlet으로 연결한 컴포넌트들의 값을 채워 준다.

- Bounty View Controller의 전체 코드 및 결과는 다음과 같다.


import Foundation
import UIKit

class BountyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    let nameList = ["brook", "chopper", "franky", "luffy", "nami", "robin", "sanji", "zoro"]
    let bountyList = [33000000, 50, 44000000, 300000000, 16000000, 80000000, 77000000, 120000000]
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return nameList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? ListCell else {
            return UITableViewCell()
        }
        let img = UIImage(named: "\(nameList[indexPath.row]).jpg")
        cell.imgView.image = img
        cell.nameLabel.text = nameList[indexPath.row]
        cell.bountyLabel.text = "\(bountyList[indexPath.row])"
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("---->  \(indexPath.row)")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

}

class ListCell: UITableViewCell {
    @IBOutlet weak var imgView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var bountyLabel: UILabel!
}

 

728x90
반응형

'ComputerScience > ios App(Storyboard)' 카테고리의 다른 글

ios - 15 Design Pattern  (0) 2021.08.02
ios - 14 Segue  (0) 2021.07.28
ios - 12 Table View, Table View Cell  (0) 2021.07.25
ios - 11 swift 기본문법(Class)  (0) 2021.07.25
ios - 10 swift 기본문법(Structure)  (0) 2021.07.22