250x250
KemiKIM
29 to iOS
KemiKIM
GitHub
Loading data ...
  • 분류 전체보기 (41)
    • 지금 : 세상에서 가장 간단한 메모 앱 (1)
    • iOS (22)
      • Swift (4)
      • Xcode, UI (7)
      • And (9)
      • 이것이 삽질이다. (2)
    • other (18)
      • Error Solution (8)
      • a Little Tip (5)
      • Mac Start Setting (5)
    • Project (0)
hELLO · Designed By 정상우.
KemiKIM

29 to iOS

Protocol과 Delegate Pattern을 이용해 Data를 가져와 표시하는 화면 구성하기. +체크표시 활성화하기
iOS/Xcode, UI

Protocol과 Delegate Pattern을 이용해 Data를 가져와 표시하는 화면 구성하기. +체크표시 활성화하기

2022. 10. 5. 16:23

(Macbook Air M1 8-256 Monterey 12.5.1 Xcode 13.1)

 

Why?

 

저번포스팅을 작성하면서 구현해보고 싶은 내용이 있어서 해당 포스팅을 작성하게 되었습니다.

 

저번포스팅에서는 단순히 Data만을 가져왔다면,

이번에는 카테고리 칸에 체크표시를 표시함으로써

좀 더 명확한 기능을 구현해보고자 합니다.

 

 

 


 

 

 

 

(1) 체크표시가 들어가야하기 때문에, 일단 임시로 설정해놨던 모델을 분리시켜보도록 합시다.

 

새로운 swift file을 만들어 모델을 설정합니다.

카테고리 이름과 체크표시를 변수로 설정해두고, 함수에 해당 내용을 담습니다.

//CategoryListModel.swift

import Foundation

struct CategoryListModel {
    let categoryListName: String
    var isSelected: Bool
    
    static func categoryList() -> [CategoryListModel] {
    	return [
            CategoryListModel(categoryListName: "Number1", isSelected: false),
            CategoryListModel(categoryListName: "Number2", isSelected: false),
            CategoryListModel(categoryListName: "Number3", isSelected: false),
            CategoryListModel(categoryListName: "Number4", isSelected: false)
            ]
    }
}

- 체크표시를 위해 isSelected 변수를 만들어준 뒤, Bool타입으로 선언해주었습니다.

 

 

 

 


 

 

 

 

(2) 모델을 만들었으니 이제 임시배열이였던 testArr를 삭제하고,

새로운 변수를 만들어 카테고리 이름을 넣어줍니다.

//CategoryViewController.swift

var newList = CategoryListModel.categoryList()

 

 

 


 

 

 

 

(3) 이제 새로운 변수에 맞게끔 extension부분을 수정해줍니다.

//CategoryViewController.swift

extension CategoryViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return newList.count
        }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell
        
        cell.textLabel?.text = newList[indexPath.row].categoryListName
        
        return cell
        }
        
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.VCdelegate(data: newList[indexPath.row].categoryListName)
        self.navigationController?.popViewController(animated: true)
        }

 

 

 


 

 

 

 

 

 

정상적으로 적용이 됬는지 확인해봅니다.

 

 

 

이제 체크표시를 구현하는 코드작업을 해야합니다.

 

 

 

 

 


 

 

 

 

(4) 먼저 선택된 내용을 담는 변수와 함수를 구현합니다.

//CategoryViewController.swift

var listName: String?

func checkMark() {
    guard let index = newList.firstIndex(where: {$0.categoryListName == listName}) else { return }
    newList[index].isSelected = true
}

 

 

 

 


 

 

 

 

(5) 정의한 함수를 viewDidLoad()에 선언해줍니다.

//CategoryViewController.swift

override func viewDidLoad() {
    .
    .
    .
    
    checkMark()
    
}

 

 

 


 

 

 

 

 

(6) 체크표시를 하기 위한 코드를 추가해줍니다.

 

체크표시를 하기 위해 extension cellForRowAt부분을 수정해줘야합니다.

 

//CategoryViewController.swift

cell.accessoryType = newList[indexPath.row].isSelected ? .checkmark : .none

 

 

추가적으로 didSelectRowAt부분도 수정해야합니다

//CategoryViewController.swift

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    for row in 0..<tableView.numberOfRows(inSection: 0) {
        if row == indexPath.row {
            newList[row].isSelected = true
            delegate?.VCdelegate(data: newList[indexPath.row].categoryListName)
            } else { newList[row].isSelected = false }
        }
        
        self.tableView.reloadData()
        self.navigationController?.popViewController(animated: true)
    }

 

 

 

 


 

 

 

 

(7) ViewController로 돌아와

buttonTapped action부분에 확인작업을 하는 코드 한 줄만 추가하면 모두 끝납니다.

//ViewController.swift

CategoryVC.listName = button.titleLabel?.text

 

 

 


 

 

 

 

정상적으로 실행되는지 확인해봅니다.

 

 

이제 모두 끝났습니다.

정상적으로 체크표시가 되면서 작동하는 것을 볼 수 있네요.

 

 

 

 


 

 

 

저번시간의 궁금증을 포스팅을 해보면서 해결했습니다.

 

 

오류가 있거나, 피드백이 있다면 언제든지 댓글로 알려주세요!

감사합니다 :)

'iOS > Xcode, UI' 카테고리의 다른 글

Alert Controller 사용하기  (0) 2023.01.19
present closure처럼 pushViewController로는 쓸 수 없는걸까?  (0) 2023.01.06
TableView Top(header) Padding 제거  (0) 2022.10.22
Protocol과 Delegate Pattern을 이용해 Data를 가져와 표시하는 화면 구성하기.  (1) 2022.09.21
super.viewDidLoad() 꼭 호출해야할까?  (0) 2022.05.24
    'iOS/Xcode, UI' 카테고리의 다른 글
    • present closure처럼 pushViewController로는 쓸 수 없는걸까?
    • TableView Top(header) Padding 제거
    • Protocol과 Delegate Pattern을 이용해 Data를 가져와 표시하는 화면 구성하기.
    • super.viewDidLoad() 꼭 호출해야할까?
    KemiKIM
    KemiKIM
    안녕하세요! iOS App Developer를 희망하는 주니어 개발자입니다.

    티스토리툴바