[ swift ] 키오스크 과제 tableView 2차

sonny·2024년 11월 27일
4

TIL

목록 보기
54/133

어제 마지막에 테이블 뷰 데이터소스까지 보았는데,

어제 팀원들에게 코드리뷰를 받아 수정을 했다

변경 후)

셀 버튼들만 따로 정의한 메서드를 만들었다.

해당 셀에 데이터를 설정해주고 버튼 액션을 연결했고,

각 버튼의 tag 속성을 행(row) 인덱스로 설정해서, 어떤 데이터와 연결되는지 식별할 수 있다.

tag란

tag는 UIView 또는 이를 상속받는 클래스의 프로퍼티인데,

주로 뷰에 숫자를 할당해 식별하는데 사용된다고 한다.

숫자 값으로 설정할 수가 있고, 이걸 통해 특정 뷰를 구분하거나 데이터와 연결하는 용도로 사용될 수 있다.

  • tag의 특징
    뷰를 식별하기 위한 용도다.
    동일한 클래스의 여러 인스턴스 중에서 특정 뷰를 구분할 때 유용하다.

  • 기본값은 0이다.
    tag를 설정하지 않으면 기본값은 0이다.

  • 정수 값을 저장한다.
    뷰와 관련된 추가 데이터를 저장하거나, 데이터의 인덱스를 관리할 수 있다.

내 코드에서 어떻게 사용 되었나.

cell.decreaseButton.tag = indexPath.row
cell.increaseButton.tag = indexPath.row
cell.deleteButton.tag = indexPath.row

만들어놓은 각 버튼 (decreaseButton, increaseButton, deleteButton)의 tag에 해당 행(row)의 인덱스를 저장했다.

버튼이 눌렸을 때 어떤 행의 데이터를 수정하거나 삭제할지 결정하는 데 사용된다.

해당 태그를 이용한 버튼액션은 우선 UI를 먼저 짠 후 보기로 하자.

UITableViewCell 만들기

우선 swift파일을 하나 추가해주고 클래스명은 MenuTableViewCell 로 지정 해준 뒤, UI요소를 하나씩 추가했다.

각 요소는 객체를 생성하고 기본값으로 초기화된 상태고,

선언된 요소들은 이후 setupUI() 메서드에서 배치될 것이다.

초기화 메서드

UITableViewCell의 지정 이니셜라이저를 오버라이드한 것이다.

style은 셀의 스타일을 결정해주는데 기본적으로 무시하고, 커스텀 디자인에 따라 직접 설정할 것이므로 큰 영향을 미치지 않는다.


style..

 override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupUI() // 셀의 UI를 설정하는 커스텀 메서드
    }

UITableViewCell은 4가지 스타일을 제공하는데,

  • .default : 기본 텍스트 레이블 하나만 표시되는 스타일이다.
  • .subtitle : 텍스트 레이블과 서브타이틀 레이블이 두 줄로 표시되는 스타일이다.
  • .value1 : 텍스트 레이블과 세부 정보 레이블이 같은 줄에 나란히 표시된다. (주로 설정 화면에서 사용)
  • .value2 : 세부 정보 레이블이 왼쪽, 텍스트 레이블이 오른쪽에 표시된다. (주로 정렬된 정보를 보여줄 때 사용)

내가 사용한 UITableViewCell.CellStyle 열거형은

테이블 뷰 셀의 기본 레이아웃 스타일을 지정하는 데 사용된다.

근데 나처럼 커스텀 셀을 사용하는 경우엔 스타일을 딱히 크게 신경 쓸 필요는 없다고 한다.

UI 요소를 직접 설정하고 제약을 추가하여 원하는 레이아웃을 만들면 되기 때문.

간단한 레이아웃이 필요할 때는 UITableViewCell.default를 사용해서 기본적인 셀을 만들 수 있는데,

뭐 이 경우엔 스타일이 의미가 있다고 봐야한다.

스타일이 유용한 경우는 단순한 레이아웃을 가진 셀이 필요할 때니까!


reuseIdentifier..

그렇게 style 뒤로 오는 reuseIdentifier 은 테이블 뷰에서 셀을 재사용하기 위한 식별자라고 보면 된다.

reuseIdentifierString?인 이유는

셀을 재사용할 때 고유하게 구분할 수 있는 식별자가 문자열로 필요하기 때문인데,

이 식별자는 테이블 뷰의 셀을 효율적으로 재사용하고 관리하는데 중요한 역할을 한다.

아 그리고 기본적으로 코드를 작성할 때 string? 으로 나온다.


super.init(style:reuseIdentifier:)

UITableViewCell의 부모 클래스 초기화 메서드를 호출하여 셀의 기본 속성을 초기화하는 것이다.

항상 부모 클래스의 초기화 메서드를 먼저 호출해야 한다는 점.

그 다음 setupUI() 은 UI 요소를 셀에 추가하고 레이아웃과 속성을 설정하는 커스텀 메서드인데,

코드 상에서 정의되지 않았지만 여기에서 모든 UI 구성 요소가 추가되고 제약 조건(SnapKit 등)도 설정될 것이다.

그리리고 하단에

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

이 메서드는 인터페이스 빌더(스토리보드 또는 XIB)에서 이 클래스가 로드될 때 호출된다고 하는데

이게 없다고 오류가 나서 xcode가 직접 Fix 해준 코드이다.

이건 코드베이스로만 셀을 생성하고 있기 때문에 스토리보드를 사용하지 않는다는 특징이 있다고 한다.

따라서 required init?(coder:)가 호출되지 않아야 한다고 하는데.. (뭐라는 건지 모르겠음)

여기에서 fatalError로 예외를 발생시켜 이 초기화 메서드가 호출되면 크래시가 발생하도록 의도적으로 처리한 것이라고 한다.

그래서 왜 필요한 것인가.

Swift는 모든 클래스가 디자인된 초기화 메서드를 반드시 구현해야 하는데,

이 클래스는 init(coder:)를 반드시 제공해야 하기 때문에

fatalError를 통해 "사용하지 않는다"는 것을 명확히 하는 것이라 한다.


setupUI

이렇게 셀 안에 들어갈 UI를 배치해주고 오토레이웃도 잡고 요리조리 하고나서 확인해보면,

이렇게 되었다.

오토레이아웃 잡으면서 버튼들이 웃기게 위치를 잡아버리는 모습을 보며

수정도 하고 그러면서 코드베이스의 오토레이아웃을 잡는 방식에 더 익숙해져가는 나를 볼 수 있었다.

근데 아직 UI만 만들었을 뿐 수량 감소나 수량 증가, 휴지통 버튼을 눌렀을 때의 액션이 필요하다.

액션은 다음에~!~!~!


음...

오늘은 UIKit의 기본적인 이해를 넘어서

커스터마이즈 셀을 구현하고.. 그리고 특히 tag 속성을 통해 데이터를 식별하고,

UITableViewCell의 초기화와 fatalError 처리 방법을 배운 것도 유익했디.

다음 내용에는 버튼 액션을 연결하고, 실제 데이터를 조작하는 기능을 추가하는 글을 써야겠다.

생각보다 코드간의 연결이 아직은 어렵다.

그래도 팀원분들이 잘 도와주셔서 좋다... 코드 언제 잘 치지

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보