2016-03-18 8 views
0

私は "toSecond"という名前のsecondViewControllerにsegueを持つviewControllerを持っています。xibからperformSegueWithIdentifierを呼び出す方法は?

のViewControllerで
viewController().goToSecond() 

私はこのコード

func goToSecond() { 
self.performSegueWithIdentifier("toSecond", sender: self) 
} 

と機能を持っていますが、私は押したとき:のViewControllerで は、私はアクションでボタンがあり、こののCustomViewでcustomView.xib

let myCustomView = NSBundle.mainBundle().loadNibNamed("customView", owner: self, options: nil)[0] 

をロードカスタムビューのボタン:エラー:

viewController has no segue with identifier 'toSecond'

この関数をviewControllerから直接呼び出すと、すごくうまくいきます!

私のカスタムビューからperformSegueWithIdentifierを呼び出すにはどうすればよいですか?

のCustomViewソースコード:

import UIKit 

class customView: UIView { 

@IBAction func ToSecondButton(sender: AnyObject) { 
viewController().goToSecond() } 

} 

のViewControllerのソースコード:

import UIKit 

class viewController: UIViewController { 

... 
let myCustomView = NSBundle.mainBundle().loadNibNamed("customView", owner: self, options: nil)[0] 
self.view.addSubview(myCustomView) 
func goToSecond() { 
    self.performSegueWithIdentifier("toSecond", sender: self) 
    } 
... 

} 
+0

カスタムビューのために、ファイルの所有者は、ビューコントローラである場合は、私は理解していないどのようにこのコード: ' viewController()。goToSecond() ' は、カスタム表示の中に含まれています。カスタムビューのソースコードをさらに提供できますか?カスタムビュー内でビューコントローラへの参照をどのように作成していますか? –

+0

私はviewControllerを提示するにはcustomViewを提示... viewControllerとsecondViewControllerの間の私のsegue ...私はviewControllerからfunc goToSecond()を直接呼び出すことができますが、customViewからはできません!関数であれば、goToSecondはprint( "Click!")のようなものを書いています。 – Dmitry

+1

今後、[Cocoa命名規則](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html#//apple_ref)に固執することをお勧めします。/doc/uid/20001281-1002242-BBCIJGDB)、すべてのクラス名は大文字で始まります。これは不必要に混乱していました... – Rob

答えて

1

問題は、あなたのUIViewサブクラスがviewController().goToSecond()を呼び出していることです。それはあなたが思っていることをしていない。 viewController()は、カスタムビューをロードしたビューコントローラを参照していません。そのクラスの2番目の孤立したインスタンス(ストーリーボードには接続されていません)をインスタンス化しているため、セグを見つけることができません。

このカスタムサブクラスでセグを開始させる場合は、元のビューコントローラーへの参照をカスタムビューに渡す必要があります。そのビューコントローラへの参照を保持できるカスタムビューサブクラスにプロパティを追加し、ビューコントローラがこのカスタムビューをインスタンス化するときに、そのプロパティを設定する必要があります。例えば


import UIKit 

protocol CustomViewDelegate: class {   // make this class protocol so you can create `weak` reference 
    func goToNextScene() 
} 

class CustomView: UIView { 

    weak var delegate: CustomViewDelegate? // make this `weak` to avoid strong reference cycle b/w view controller and its views 

    @IBAction func toSecondButton(sender: AnyObject) { 
     delegate?.goToNextScene() 
    } 

} 

そして

import UIKit 

class ViewController: UIViewController, CustomViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let myCustomView = NSBundle.mainBundle().loadNibNamed("customView", owner: self, options: nil)[0] as! CustomView 
     myCustomView.delegate = self 

     // ... do whatever else you want with this custom view, adding it to your view hierarchy 
    } 


    func goToNextScene() { 
     performSegueWithIdentifier("toSecond", sender: self) 
    } 

    ... 

} 
+0

これはどうやってできますか?私の質問が愚かであれば申し訳ありません... – Dmitry

+1

@Dmitry - 修正された答えのコードスニペットを見てください。 – Rob

+0

ありがとうございました! – Dmitry

関連する問題