티스토리 뷰

반응형

이번 포스팅은 Swift에서 가장 많이 사용하는 AlertController 에서 발생했던 이슈를 소개하려고 합니다.


보통 AlertController은 다음과 같이 사용할 것입니다.




아이폰에서는 정상 동작하지만 태블릿에서는 다음과 같은 에러가 발생합니다.


 *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UIAlertController: 0x7fea584110f0>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem.  If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'


태블릿에서는 AlertController  의 위치를 설정해 줘야합니다. 


예를 들어 

1) 화면의 정중앙에 호출합니다. 

2) BarButtonItem 기준으로 호출합니다.

3) 기타 등등..


제가 해결한 방법은 화면의 중앙에 위치하도록 하였습니다.


// swift 4


if let popoverController = alert.popoverPresentationController {

   popoverController.sourceView = self.view

 

   popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)

 

   popoverController.permittedArrowDirections = []

}




만약 "viewDidLoad()"에서 "UIAlertController()"를 호출 시 아래와 같은 경고가 발생 할 경우도 있습니다.


Warning: Attempt to present <UIAlertController: 0x7f8b2260a010> on <UIAlertActionTest.ViewController: 0x7f8b25103260> whose view is not in the window hierarchy!


현재 뷰가 생성 되기도 전에 View 을 호출해서 나오는 이슈입니다. "viewDidLoad()” 에서 호출 한 것을 “viewDidAppear()”에서 호출하면 이슈 발생하지 않습니다.


AlertController는 "ViewDidAppear()" 에서 생성합니다.


UIAlertController 호출하는 다른 방식은 참고 사이트에 자세히 소개되어있습니다.




참고


반응형
댓글