17610
Swift(iOS
SDK8.4)で、NavigationControllerを使用して基点となるA画面からB画面に画面遷移を行うアプリケーションを構築しようとしていますが、  
A画面で画面遷移をさせるボタンを押下した際に実行される performSegueWithIdentifier（） で、「has no segue with
identifier 'next'」という内容で NSInvalidArgumentException が発生してしまい、行き詰まってしまっています。

NavigationControllerは以下のとおりAppDelegateに定義しています。

```

    class AppDelegate: UIResponder, UIApplicationDelegate {
    
      var window: UIWindow?
      var mainNavigationCtrl: UINavigationController?
    
      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let first = FirstViewController()
        mainNavigationCtrl = UINavigationController(rootViewController: first)
    
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = mainNavigationCtrl
        self.window?.makeKeyAndVisible()
    
        return true
      }
    }
    
```

Storybord上にA画面とB画面をsegueで紐付けており、名前は'next'と定義しています。  
A画面からB画面へは値を渡したいので、下記のとおりにコーディングしました。

```

    class FirstViewController() {
      func onClick() {
          self.performSegueWithIdentifier("next", sender: self)
      }
    
      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
          if (segue.identifier == "next") {
              var view = segue.destinationViewController as! SecoundViewController
              view.lblName = self.Name.text!
          }
      }
    }
    
```

AppDelegateのNavigationControllerをコメントアウトすると、performSegueWithIdentifierが正常に動作し、prepareForSegueへ処理が遷移してB画面へ値を渡した状態で遷移できました。

エラー解決方法や、そもそも実現方法に誤りがある等々、ご回答お願いします。
CC BY-SA 3.0
2015-10-13T12:10:50.797
17603
2015-10-13T18:33:05.463
2015-10-13T14:08:43.973
6103
6103
question
ios swift
SwiftでNavigationControllerを使用した際にperformSegueWithIdentifierでエラー
> エラー解決方法や、そもそも実現方法に誤りがある等々、ご回答お願いします。

はい、その「そもそも実現方法に誤りがある」です。  
`AppDelegate`に記述したコードでは、`FirstViewController`のインスタンスを、Storyboardと結びつけていない状態で生成しています。Storyboardに結びついていないので、Storyboardを使った処理は、エラーになります。  
Storyboardと結びついた`UIViewController`を生成するには、`UIStoryboard`クラスの`instantiateInitialViewController()`か`instantiateViewControllerWithIdentifier()`メソッドを使います。前者を使うと、

```

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) // Storyboardの名称は、任意。
        mainNavigationCtrl = mainStoryboard.instantiateInitialViewController()
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = mainNavigationCtrl
        self.window?.makeKeyAndVisible()
    
        return true
    }
    
```

ただし、これはアプリの設定で指定したStoryboard以外のStoryboardを使用する場合の処理です。`AppDelegate`になにも記述しなければ、デフォルトのStoryboardから起動します。
CC BY-SA 3.0
2015-10-13T18:33:05.463
17610
2015-10-13T18:33:05.463
7362
17603
answer