Swift를 사용하여 앱 델리게이트에서 뷰 컨트롤러 열기
푸시에서 얻은 정보에 따라 어떤 뷰를 열지 결정하는 푸시 알림을 만들려고합니다.
푸시에서 정보를 얻을 수 있었지만 지금은보기를 열기 위해 고군분투하고 있습니다.
다른 스택 오버플로 질문을 살펴보면 현재 다음이 있습니다.
App Delegate로드 완료 :
//Extract the notification data
if let notificationPayload = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {
// Get which page to open
let viewload = notificationPayload["view"] as? NSString
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
//Load correct view
if viewload == "circles" {
var viewController = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier("Circles") as! UIViewController
self.window?.rootViewController = viewController
}
}
현재 이것은 var ViewController = self ... 줄에서 실패합니다.
아래 그림과 같이 ViewController StoryBoardId 속성을 설정해야합니다.
신속하게 아래와 같이 코딩을 사용하여 viewController를 엽니 다.
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewControlleripad : UIViewController = mainStoryboardIpad.instantiateViewControllerWithIdentifier("Circles") as UIViewController
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = initialViewControlleripad
self.window?.makeKeyAndVisible()
return true
}
스위프트 3 :
이것은 AppDelegate를 통해 현재 viewController에서 새 viewController를 표시 할 때 선호하는 접근 방식입니다. 이렇게하면 푸시 알림 또는 범용 링크를 처리 할 때 뷰 계층 구조를 완전히 뜯어 낼 필요가 없습니다.
if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someController") as? SomeController {
if let window = self.window, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentedController = currentController.presentedViewController {
currentController = presentedController
}
currentController.present(controller, animated: true, completion: nil)
}
}
스위프트 3
내비게이션 컨트롤러와 함께보기를 표시하려면 :
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier :"InboxViewController") as! InboxViewController
let navController = UINavigationController.init(rootViewController: viewController)
if let window = self.window, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentedController = currentController.presentedViewController {
currentController = presentedController
}
currentController.present(navController, animated: true, completion: nil)
}
먼저 초기화 window
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
Class rootViewController
내부 설정 용AppDelegate
let viewController = storyBoard.instantiateViewControllerWithIdentifier("Circles") as UIViewController
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()
신속한 4 버전이 있습니다.
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewControlleripad : UIViewController = mainStoryboardIpad.instantiateViewController(withIdentifier: "Circles") as UIViewController
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = initialViewControlleripad
self.window?.makeKeyAndVisible()
return true}
Swift 3에서
let mainStoryboard : UIStoryboard = UIStoryboard(name: StorybordName, bundle: nil)
let initialViewControlleripad : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: identifierName) as UIViewController
if let navigationController = self.window?.rootViewController as? UINavigationController
{
navigationController.pushViewController(initialViewControlleripad, animated: animation)
}
else
{
print("Navigation Controller not Found")
}
rootViewController를 변경할 때마다 UIWindow를 만드는 것은 나쁜 생각이라고 말하고 싶습니다. rootVC를 몇 번 변경하면 (상위 솔루션 사용) 한 번에 많은 UIWindows를 앱에 갖게됩니다.
제 생각에 더 나은 해결책은 다음과 같습니다.
- 새 rootVC 가져 오기 :
let rootVC = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewControllerWithIdentifier("newRootVCIdentifier") as UIViewController
- UIScreen의 경계에서 새 rootVC에 대한 프레임을 설정합니다.
rootVC.view.frame = UIScreen.mainScreen().bounds
- 현재 창에 대한 새 루트 컨트롤러 설정 (여기에서는 애니메이션 포함) :
UIView.transitionWithView(self.window!, duration: 0.5, options: .TransitionCrossDissolve, animations: { self.window!.rootViewController = rootVC }, completion: nil)
끝난!
window?.makeKeyAndVisible()
이 솔루션은 현재 앱 창에서 작동 하므로 method가 필요하지 않습니다 .
스위프트 3 SWRevealViewController
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyBoard.instantiateViewController(withIdentifier: "SWRevealViewController") as! SWRevealViewController
self.window?.rootViewController = viewController
self.window?.makeKeyAndVisible()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationViewController = storyboard.instantiateViewController(withIdentifier: "LandVC") as! LandingPageVC
destinationViewController.webpageURL = NotificationAdvertisement._htmlpackagePath
destinationViewController.adID = NotificationAdvertisement._adID
destinationViewController.toneID = NotificationAdvertisement.toneID
let navigationController = self.window?.rootViewController as! UIViewController
navigationController.showDetailViewController(destinationViewController, sender: Any?.self)
SWIFT 4
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationViewController = storyboard.instantiateViewController(withIdentifier: "LandVC") as! LandingPageVC
destinationViewController.webpageURL = NotificationAdvertisement._htmlpackagePath
destinationViewController.adID = NotificationAdvertisement._adID
destinationViewController.toneID = NotificationAdvertisement.toneID
let navigationController = self.window?.rootViewController as! UIViewController
navigationController.showDetailViewController(destinationViewController, sender: Any?.self)
참조 URL : https://stackoverflow.com/questions/30592521/opening-view-controller-from-app-delegate-using-swift
'IT TIP' 카테고리의 다른 글
배열의 모든 내용을 C #으로 인쇄 (0) | 2020.12.26 |
---|---|
Android : dialogfragment가 표시되는지 확인하는 방법 (0) | 2020.12.26 |
가변 너비의 부동 요소를 수평으로 중앙에 배치하는 방법은 무엇입니까? (0) | 2020.12.26 |
목록이 Java로 정렬되었는지 확인하는 방법은 무엇입니까? (0) | 2020.12.26 |
Heroku에서 Postgres DB 삭제 (0) | 2020.12.26 |