1. 오늘 진행한 작업
아직 디자인이 나오지 않은 부분인데, 사이드메뉴에서 로그인이 되지 않은 게스트 상태일 때 어떻게 띄울지도 구현을 해야했다.
로그인이 되지 않았다면 기존 포스트에서 나오던 기능들의 대부분을 쓸 수 없기에 테이블 뷰 내 cellForRowAt 구성도 바꿔주어야 했는데, 이 로그인 여부는 프로젝트에서 jwt를 쓰고 있기에 액세스 토큰의 존재 여부로 확인하기로 했다.
2. 겪었던 문제와 해결
로그인을 했을땐 메뉴가 네 개, 로그인을 하지 않았을땐 메뉴가 한 개인데 이를 어떻게 Delegate, DataSource 측에서 관리시켜주지? 가 가장 큰 문제였다.
이런 상태에 따라서 달라지는 테이블뷰는 처음 구현해보는데 그냥 메뉴의 이름으로 구분을 할 수는 없을까? 하다가 나온 결론이 enum 타입이었다. 사실 이 부분만 보면 그냥 String의 배열로 isLoggedIn에 따라 다르게 리턴해주면 되는데, 이에 대한 처리 메서드를 정의하는 부분에서 indexPath.row로 받기엔 어렵겠다 싶어 이렇게 결정했다.
enum MenuItem {
case myBlog
case drafts
case settings
case logout
var title: String {
switch self {
case .myBlog: return "내 블로그"
case .drafts: return "임시글"
case .settings: return "설정"
case .logout: return "로그아웃"
}
}
}
class SideMenuViewModel {
var isLoggedIn: Bool {
return KeychainHelper.shared.getAccessToken() != nil
}
var menuItems: [MenuItem] {
if isLoggedIn {
return [.myBlog, .drafts, .settings, .logout]
} else {
return [.settings]
}
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.section {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: MenuStringCell.identifier, for: indexPath) as? MenuStringCell else {
return UITableViewCell()
}
cell.configure(title: sideMenuViewModel.menuItems[indexPath.row].title)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch indexPath.section {
case 0:
let selectedItem = sideMenuViewModel.menuItems[indexPath.row]
delegate?.didSelectMenuItem(selectedItem)
case 1:
return
default:
return
}
}
일부 생략한 코드인데, 이렇게 enum에서 정의한 title 변수도 연계해서 설정해줄 수 있다. enum으로 골랐던 이유가 이 delegate.didSelectMenuItem(selectedItem)인데, 이렇게 하지 않으면 이에 대한 메서드를 설정하는 측에서 어느 메뉴를 골랐는지에 대한 매개체를 삼기 애매하다는 생각이었다.
extension HomeViewController: MenuViewDelegate {
func didSelectMenuItem(_ menuItem: MenuItem) {
handleMenuToggle()
switch menuItem {
case .myBlog:
return
case .drafts:
return
case .settings:
return
case .logout:
print("로그아웃")
UserDefaultsManager.shared.clearUserInfo()
KeychainHelper.shared.clearTokens()
default:
return
}
}
func didTapCloseButton() {
sideMenuView.toggleMenu()
}
}
요렇게 Delegate 쪽 완성 시키는 부분에서 case 별로 메서드를 지정시켜줄 수 있게 되었다.
열거형은 네트워크 에러 정의할때도 주된 개념으로 쓰이는데, 생각 이상으로 쓸 데가 많으니 제대로 알아두는게 좋겠다.
이 외에도 로그인 여부를 체크한다던지, 헤더를 로그인 여부에 따라 다르게 로드한다던지에 대해도 구현했지만 이정도만 기록한다.
'iOS > Swift' 카테고리의 다른 글
[TIL / 25.02.21] SkeletonView 적용 및 생명주기 관련 문제 해결 (0) | 2025.02.21 |
---|---|
[TIL / 25.02.17] 뷰 맨 앞으로 보내기 (0) | 2025.02.17 |
[TIL / 25.02.13] 다중 섹션 및 헤더가 포함된 사이드 메뉴 구현 (0) | 2025.02.13 |
[TIL / 25.02.11] 사이드메뉴를 구현해보자 . . . ! (0) | 2025.02.11 |
[TIL / 25.02.10] 헤더를 이용한 테이블뷰를 구성, 셀과 헤더 높이 자동 계산 (4) | 2025.02.10 |