2017-10-18 10 views
2

プッシュ通知からView Controllerをインスタンス化したかったので、ほとんどのチュートリアルでは、VCの識別子を渡して、それらをストーリーボードIDと突き合わせることを提案しています。StoryboardsまたはNIB/XIBを使用せずに、stringからViewView文字列名を使用してUIViewControllerクラスインスタンスを作成しますか?

問題は私のアプリがプログラマチックに作られているため、ストーリーボードIDを追加できません。

私はこのプログラムで解決できるので、私は文字列を介してVCを参照できますか?

更新:
私の主張は、通知がどのVCをインスタンス化するかの文字列を解析する場合です。 "Deashboard"私はその文字列に一致するIDを介してロードできません。それぞれのケースであなたのコードを実行するすべての可能性について大量のswitch文が必要です。

+0

あなたはストーリーボードビューコントローラ設計のための(ないセグエ接続)を持っていませんか? – Krunal

+0

いいえ、そのすべてのプログラム – jackdm

+0

"私はVCを参照することができます"そしてどうやってそれを初期化するのですか?あなたはstoryboardIDを使う必要はありません。あなたは 'MyVCForPush * vc = [[MyVCForPush alloc] init]'を実行することができます。 'MyVCForPush * vc = [[MyVCForPush alloc] initWithXibName:@someName]'、そして '[vc setPushInfo:myPushInfo]'を入力し、それを提示します。 – Larme

答えて

0

viewholderまたはnibファイルに関連付けられていないビューコントローラは、クラスの)デフォルトのinitiazerはView Controllerのインスタンスを提供します。

これを試してみてください:

は、Objective-Cの

ViewController *viewController = [[ViewController alloc] init]; 
[self.navigationController pushViewController:viewController animated:true]; 

スウィフト

let viewController = ViewController() 
navigationController?.pushViewController(viewController, animated: true) 


更新
文字列クラス名をView Controllerに変換するには、次の拡張を試してください。今

extension NSObject { 

    func viewControllerFromString(viewControllerName: String) -> UIViewController? { 

     if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String { 
      print("CFBundleName - \(appName)") 
      if let viewControllerType = NSClassFromString("\(appName).\(viewControllerName)") as? UIViewController.Type { 
       return viewControllerType.init() 
      } 
     } 

     return nil 
    } 

} 

if let viewController = viewControllerFromString(viewControllerName: "ViewController") as? ViewController { 
    navigationController?.pushViewController(viewController, animated: true) 
} 

同様の機能文字列の拡張子を持つクラス文字列から、あなたのビューコントローラを取得:

extension String { 

    func getViewController() -> UIViewController? { 

     if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String { 
      print("CFBundleName - \(appName)") 
      if let viewControllerType = NSClassFromString("\(appName).\(self)") as? UIViewController.Type { 
       return viewControllerType.init() 
      } 
     } 

     return nil 
    } 

} 


if let viewController = "ViewController".getViewController() as? ViewController { 
    navigationController?.pushViewController(viewController, animated: true) 
} 
+0

これは私が行うことですが、私の主張はもし通知が、インスタンス化するVCの文字列を解析するならば"Deashboard"私はその文字列に一致するIDを介してロードできません。それぞれのケースであなたのコードを実行するすべての可能性について大量のswitch文が必要です。 – jackdm

+0

更新された答えを試してください – Krunal

+0

@KrunalこのCFBundleNameは何ですか?それはどこから来ますか? – ArgaPK

関連する問題