그러면 notificaton center를 이용해서 로그아웃 기능을 구현해보자.
일단 로그아웃을 위한 버튼을 만들자.
*protocol-delegate 패턴을 사용해서 로그아웃 기능을 구현하려면 AccountSummaryViewController → MainViewController → AppDelegate 로 가는 모든 과정에서 delegate를 추가해주어야 한다.
Util 폴더에 NSNotificationName.swift
파일을 생성한다.
import Foundation
extension Notification.Name {
static let logout = Notification.Name("Logout")
}
Notification.Name
은 라디오 스테이션과 같은 역할을 해준다.
AppDelegate에 이벤트를 등록한다.
private func registerForNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(didLogout), name: .logout, object: nil)
}
NotificationCenter
의 싱글턴 인스턴스AccountSummaryViewController
의 logoutTapped
메소드에서 notification을 보내는 코드를 추가한다.
extension AccountSummaryViewController {
@objc func logoutTapped(sender: UIButton) {
NotificationCenter.default.post(name: .logout, object: nil)
}
}
🤔 protocol-delegate 패턴을 쓰지 말고 전부 Notification Center만 쓸 순 없는 걸까?
protocol-delegate는 뷰 컨트롤러와 뷰 컨트롤러, 또는 앱의 다른 부분과 직접적으로 커뮤니케이션 할 수 있는 방법이기 때문에 이를 더 많이 선호한다.
Notification Center를 과도하게 사용하지 않도록 주의하자.
Utils 폴더에서 UITextField+SecureToggle.swift
파일을 새로 만든다.
아래와 같이 코드를 작성한다.
import Foundation
import UIKit
let passwordToggleButton = UIButton(type: .custom)
extension UITextField {
func enablePasswordToggle() {
passwordToggleButton.setImage(UIImage(systemName: "eye.fill"), for: .normal)
passwordToggleButton.setImage(UIImage(systemName: "eye.slash.fill"), for: .selected)
passwordToggleButton.addTarget(self, action: #selector(togglePasswordView), for: .touchUpInside)
rightView = passwordToggleButton
rightViewMode = .always
}
@objc func togglePasswordView(_ sender: Any) {
isSecureTextEntry.toggle()
passwordToggleButton.isSelected.toggle()
}
}
passwordToggleButton
을 선언한다.isSecureTextEntry
와 같은 프로퍼티들에 바로 접근할 수 있다.LoginView
에서 enablePasswordToggle()
을 적용시킨다.
passwordTextField.enablePasswordToggle()
화면 크기가 작으면 label의 내용이 잘려서 나올 때가 있다. (iOS에서는 기본적으로 다 보여지지 않는 텍스트는 ...
로 표시해준다.)
실제 앱을 개발할 때 이런 문제가 발생하는 경우, 이를 해결하는 방법에는 세 가지가 있다.
세 번째 방법은 adjustsFontSizeToFitWidth
프로퍼티를 이용해서 쉽게 적용할 수 있다.
// AccountSummaryCell.swift
nameLabel.adjustsFontSizeToFitWidth = true
balanceLabel.adjustsFontSizeToFitWidth = true