iOS 프로젝트/작심삼일

[iOS] 작심삼일 개발 일지 - 3

유정주 2022. 2. 7. 00:10
반응형

안녕하세요. 개발하는 정주입니다.

 

오늘은 작심삼일 개발 일지 - 3에 대해 포스팅하려고 합니다.

 

https://github.com/jeongju9216/ThreeDayHump

 

GitHub - jeongju9216/ThreeDayHump: "작심삼일" iOS 애플리케이션 1인 프로젝트

"작심삼일" iOS 애플리케이션 1인 프로젝트. Contribute to jeongju9216/ThreeDayHump development by creating an account on GitHub.

github.com

 

* 해당 포스팅은 대략적인 개발 일지로 자세한 내용은 필요시에만 따로 포스팅합니다.

 

Custom Alert

커스텀 Alert를 만든 이유

"오늘도 해냈다" 버튼을 누르거나 작심삼일을 성공했을 때, 포기 버튼을 누를 때 등 기본 Alert를 사용하고 있었습니다.

iOS에서 지원하는 Alert도 충분하긴 하지만 작심삼일만의 컬러 디자인을 적용하고 싶었습니다.

또한 H.I.G에서 나온 내용을 참고해서 기본 Alert는 시스템 경고를 할 때만 사용하려고 커스텀 Alert를 만들기로 했습니다.

 

버튼 타입

버튼 타입은 enum을 이용해 미리 구분했습니다.

enum AlertType: Int {
    case oneButton, twoButton
}

버튼이 하나인 Alert는 oneButton, 버튼이 두 개인 Alert는 twoButton입니다.

 

two button

아직까지는 포기 Alert만 two Button이고 나머지는 one Button입니다.

 

버튼은 UIStackView를 이용해서 hidden값을 false로 했을 때 자동으로 여백이 채워지도록 구현했습니다.

이렇게 하면 one button과 two button UI를 공유할 수 있다는 이점이 있습니다.

 

UIViewController vs UIView

커스텀 Alert를 만드는 방법이 View와 View Controller 두 개로 나뉘었습니다.

저는 커스텀 Alert를 View Controller로 생성하기로 결정했습니다.

View Controller가 비교적 구현이 쉬워 보였기 때문입니다.

둘 중 어떤 것으로 해도 성능이나 가독성에서 이슈가 생기지는 않을 것 같아서 선택에 부담은 없었습니다.

 

StoryBoard vs Code

이제는 Alert UI를 스토리보드와 Code 중 어떤 것으로 구현할지 고민했습니다.

 

지금은 스토리보드에서 UI를 구현하고자 하기 때문에 스토리보드를 선택했지만 나중에 코드로 리팩토링을 진행해보려고 합니다.

이런 간단한 UI는 오히려 코드로 하는게 프로젝트가 가벼워질 것 같다고 느꼈기 때문입니다.

 


Action은 어떻게 전달하지?

커스텀 Alert를 구현하며 가장 어려웠던 부분입니다.

Alert를 띄우는 상황에 따라 OK 버튼의 동작이 달라지는 로직을 어떻게 구현해야 하나 고민을 했습니다.

 

View Controller의 convenience init을 이용해 Action에 해당하는 메서드를 전달하기까지는 생각이 도달했지만 그 이상이 어려웠죠.

이때 제가 놓친 것은 Swift에서 메서드(함수)는 클로저이고 1급 객체이므로 파라미터로 전달이 가능하다는 점입니다.

 

이것을 알게 되니 코드를 작성하는 것은 어렵지 않았습니다.

convenience init(titleText: String? = nil, messageText: String? = nil, doneText: String = "확인", doneAction: UIAction? = nil) {
        self.init()

        self.titleText = titleText
        self.messageText = messageText
        self.alertType = .oneButton
        self.doneText = doneText
        self.doneAction = doneAction
        
        modalPresentationStyle = .overFullScreen
    }
let alertViewController = AlertViewController(titleText: "안내", messageText: message, doneText: "확인", doneAction: UIAction { [weak self] _ in
            self?.dismiss(animated: false, completion: nil)
        })

 

위 코드처럼 마지막 인자로 클로저를 전달하면 init이 길어질 것 같아 호출하는 곳에서 클로저를 UIAction으로 만들어 전달했습니다.

제가 조금 더 성장하면 부족한 점을 리팩토링 할 수 있겠죠?

 


참조

https://zeddios.tistory.com/1093

https://stackoverflow.com/questions/25919472/adding-a-closure-as-target-to-a-uibutton


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

 

반응형