티스토리 뷰
안녕하세요 :)
alert에서 한가지 빼먹은걸 발견해서 XD..
원래꺼 이어서 쓰려다가 그냥 새로 글을 썼습니다 :)
alert의 HIG기억하시나요?
만약에 경고가 떠있는 상태에서, 홈버튼을 누르면 취소버튼을 누르는 것과 동일한 효과를 가져와야한다고 하죠?
이 방법을 알려드리지 않아서 XD
빨리.. alert 코드를 짜서 테스트 해볼게요.
자. 간단하게 alert가 나오게 해봤어요 :)
그리고 홈버튼을 누르고, 다시 앱으로 들어오면, 이 경고창이 사라져야하는데..
이렇게 버젓이 떠있는 것을 볼 수 있습니다 ㅎㅎ
그럼 홈버튼을 딱 눌렀을 때, 경고창을 사라지게 하는 액션을 코드에 추가해줘야겠죠?
app delegate에 어떤 함수를 추가해줘서 하는 방법이 있다고 하는데 ㅠㅠ
제 뷰컨트롤러에 있는 alert에 대한 접근을 어떻게 하는지 모르겠어서...저는 다른방법으로 했습니다!!
어떻게 했는지 알려드릴게요 :-)
viewDidLoad에 가셔서,
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(dismissFunc), name: Notification.Name.UIApplicationWillResignActive, object: nil)
위 코드를 추가해주세요.
NotificationCenter를 이용한 방법인데요, NotificationCenter는 간단하게 그냥 "정보를 앱내에 브로드캐스트해준다"라고 생각하시면돼요. 정말 "알림"이죠.
주로 앱내의 어떤 "상태 변화"를 감지하기 위해서 사용되곤 해요. 우리는 지금 사용자가 홈버튼을 눌렀는지! 체크할거잖아요?
그래서 NotificationCenter를 쓰면 된답니다. 정확히는 앱이 active상태가 아니냐 맞냐는 상태를 체크하는 거지만요.ㅎㅎ
NotificationCenter의 객체를 선언해주고, NotificationCenter에 addObserver라는 메소드를 불러와줍니다.
알림을 받고싶은 것을 지정해주는 작업이죠.
첫번째 파라미터에는 observer가 들어가게되는데, self로 해주면 되고,
두번째 파라미터. selector가 있습니다. 노티를 받고 실행해줄 함수를 넣어주면 됩니다.
위의 dismissFunc이라는 함수는 alert뷰를 사라지게 만들어주는 역할을 해주겠죠? 이따가 같이 구현해봅시다. 그리고 세번째 파라미터 name. 관찰자(옵저버)를 등록할 노티의 이름입니다. 즉, 이 파라미터로 전달되는 노티만이 관찰자(옵저버)에게 전달이 되는것이죠.
그러면 우리는 어떤 통지를 받아야할까요? 어떤 상태의 변화를 받아야할텐데, 그것이 바로 홈버튼을 눌렀을 때, 즉 앱이 active상태가 아니게될때겠죠.
그래서 그걸 감지해주는, UIApplicationWillResignActive를 불러온것이랍니다 :)
그리고 마지막 파라미터 object는 nil을 적어주세요.
자. 그리고 이제 우리가 selector로 넘겨준 함수. dissmissFunc을 구현해봅시다.
func dismissFunc(){
self.alert.dismiss(animated: true, completion: nil)}
자, 홈버튼 (command+shift+H를 누르면 됩니다.)을 누르고 다시 앱으로 돌아가면 경고창이 없어져있죠?
ㅎㅎ
※ 주의할 점
1. dismissFunc에서 alert객체를 접근해야하기때문에 alert객체를 전역으로 선언해주어야 합니다.
2. alert객체를 전역으로 선언해주셨다면 --> 저는 버튼을 누르면 경고창이 나타나도록 했는데, 만약
var action = UIAlertAction(title: "취소", style: .default, handler:nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
버튼의 IBAction 메소드부분을 이렇게 구현하셨다면, 버튼을 누를때마다 alert에 액션이 하나씩 들어나게 됩니다. (alert.addAction(action))
처음부터 alertController를 만들어주는게 아니라, alertController가 전역변수로 있기 때문에 이런 현상이 나타게됩니다.
이렇게 말이죠. 그래서 저는 버튼액션에는 present만 구현했어요.
(이미 alert를 모두 구현해놓고, 버튼 IBAction에는 그 alert를 띄워주는 작업만 하게끔)
3. 주의할점은 아니지만, iOS 8부터는 위에서 등록한 addObserver를 해제해줄 필요가 없어졌습니다!
옵저버의 참조카운터를 계산해서 알아서 해제해준다고 해요 :)
하지만, 옵저버의 타겟이 없는, 클로저 방식을 사용할때는 여전히 옵저버를 등록해제 시켜줘야한다고 하네요 :)
(removeObserver라는 메소드를 통해 옵저버를 해제할 수 있습니다.)
혹시 모르니 전체 코드는 첨부해둘게요.
ㅎㅎ오늘 어떠셨나요 :) 저도 많이 배울 수 있는 시간이었어요 XD
다음 글에서 봐요!!
도움이 되었으면 좋겠어요ㅎㅎ
'iOS' 카테고리의 다른 글
iOS ) 키보드에 의해 TextField가 가려지는 현상 해결 (Swift) (18) | 2017.07.11 |
---|---|
iOS ) TextField 키보드 return 을 Done으로 바꾸기(Change 'Return' button function to 'Done' ) (2) | 2017.07.11 |
iOS ) 제스쳐(gesture) 사용해보기 / touchesBegan VS Tap Gesture Recognizer (1) | 2017.07.02 |
iOS ) 왕초보를 위한 Alert View사용해보기 (2/3) (10) | 2017.06.29 |
iOS ) 왕초보를 위한 Alert View사용해보기(Human Interface Guidelines - Alert) (1/3) (0) | 2017.06.29 |
- fastlane
- SwiftUI
- swift3
- swift array
- iOS delegate
- np-hard
- Swift
- WidgetKit
- WWDC
- Accessibility
- swift delegate
- Git
- swift 공부
- actor
- 피아노
- swift sort
- FLUTTER
- WKWebView
- 회고
- UIBezierPath
- github
- 스위프트
- Combine
- 스위프트 문법
- IOS
- np-complete
- 제이슨 파싱
- Xcode
- ios 13
- swift tutorial
- Total
- Today
- Yesterday