2016-10-20 87 views
2

我註冊了我的應用程序來打開特定的文件類型(在我的情況下是CVS)。因此,當用戶觸摸「打開方式 - >我的應用」從AppDelegate通知視圖控制器的正確方法是什麼?

application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) 

功能被觸發。在這個函數中,我從文件讀取數據到本地數組。 在我的視圖控制器中,我需要顯示以上數據。那麼通知VC數據是否被接收並向其傳遞數據的正確方法是什麼?

+1

http://stackoverflow.com/a/30541063/2303865 –

回答

2

您需要發佈這樣的通知:

在某處,常量文件:

extension Notification.Name { 
    public static let myNotificationKey = Notification.Name(rawValue: "myNotificationKey") 
} 

在AppDelegate中:

let userInfo = [ "text" : "test" ] //optional 
NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo) 

在視圖控制器的viewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(self.notificationReceived(_:)), name: Notification.Name.myNotificationKey, object: nil) 

回調視圖控制器:

func notificationReceived(_ notification: Notification) { 
    //getting some data from userInfo is optional 
    guard let text = notification.userInfo?["text"] as? String else { return } 
    //your code here 
} 
+0

謝謝!有用 :) – light

0

由Alex以上回答的工作,如果處理該通知您的視圖控制器恰好是在屏幕上時,通知進來,但往往時間它不是。在

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) 

您想要更新徽章數,然後檢查通知。根據您使用的通知類型,您可以靜靜地處理它(也許使用上面的通知中心方法),或者啓動相應的視圖控制器,並將整個通知或ID傳遞給視圖控制器,並讓視圖控制器使用編號來獲得所有的細節。您可以像通常更改視圖控制器一樣執行此操作,因此如果其導航控制器實例化新視圖控制器,則將其傳遞給數據,然後將其推送到導航控制器上。

let notificationTableViewController = UIStoryboard(name: Identifiers.Storyboard.Notification, bundle: nil).instantiateViewController(withIdentifier: String(describing: NotificationTableViewController.self)) as! 
    NotificationTableViewController 
    controller.notificationId = notificationId 
    rootNavigationController?.pushViewController(notificationTableViewController, animated: true) 

如果您有一個標籤欄應用程序,則首先切換選項卡。如果您有某種自定義導航,則需要在您的容器類上調用適當的方法。

0

不需要使用通知。你的應用程序將是一團糟。

JLRoutes可以幫到你!請參閱github頁面中的示例。

在您的應用中定義一些URL,就像xxxDetail,xxxList和JLRoutes一樣。 當application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:])被調用。您只需撥打 致電[JLRoutes route: URL]

您也可以用相同的方式處理didReceiveRemoteNotification

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) { 
// get URL from userInfo 
// [JLRoutes route: url]; 
} 

讓服務器端發送給您和您定義的URL用戶信息。

相關問題