2016-03-18 19 views
0

"toSecond" adlı secondViewController segue ile viewController sahibim.xib'den performSegueWithIdentifier nasıl aranır?

viewController içinde
viewController().goToSecond() 

Bu kod

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

ile işlevi vardır ama basıldığında: viewController olarak i eylem ile düğmesi bu customView içinde customView.xib

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

yük customView düğmesine bir hata oluyorum:

viewController has no segue with identifier 'toSecond'

Bu işlevi doğrudan viewController'dan aradığımda tüm işlemler harika!

Peki, performSegueWithIdentifier öğesini benim customView'ümden nasıl arayabilirim?

customView kaynak kodu:

import UIKit 

class customView: UIView { 

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

} 

viewController kaynak kodu:

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

özel bir görünüm için dosya'nın sahibi manzarası denetleyicisi ise, anlamıyorum nasıl bu kodu: ' viewController() goToSecond() ' özel görünümünüzün içinde bulunur. Özel görünümünüz için daha fazla kaynak kodu sağlayabilir misiniz? Özel görünümde görünüm denetleyicisine nasıl bir başvuru oluşturuyorsunuz? –

+0

view viewer gösterme içinde customView mevcut ... viewController ve secondViewController arasında segue ... func goToSecond() viewController'dan doğrudan çağrı yapabilir ama customView'den olamaz! Eğer goToSecond işlevinde baskı gibi bir şey yazıyorsanız ("Tıklayın!") bu logu tıklatarak görüyorum! – Dmitry

+1

Gelecekte, [Cocoa adlandırma kuralları] 'na uymanızı tavsiye ederim (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html#//apple_ref/doc/uid/20001281-1002242-BBCIJGDB), tüm sınıf adları büyük harflerle başlar. Bu gereksiz kafa karıştırıcı oldu ... – Rob

cevap

1

Sorun UIView alt sınıf viewController().goToSecond() aradığını olmasıdır. Bu düşündüğün şeyi yapmıyor. viewController(), özel görünümünüzü yükleyen görünüm denetleyicisine başvuruyor. Bu sınıfın ikinci, yetim bir örneğini (herhangi bir hikaye tahtasına bağlı değil) ortaya çıkarır ve bu nedenle segue'yi bulamaz. Bu özel UIView alt sınıfına gerçekten sahip olacaksanız, özgün görünüm denetleyicinize bir referansı özel görünüme iletmeniz gerekir. Bu nedenle, görünüm denetleyicisine referansı tutabilecek özel görünüm alt sınıfına bir özellik ekleyin ve görünüm denetleyicisi bu özel görünümü başlattığında, bu özelliği ayarlamanız gerekir. Örneğin


:

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() 
    } 

} 

Sonra

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

Peki, bunu nasıl yapabilirim? Üzgünüm, sorularım aptalca ... – Dmitry

+1

@Dmitry - Revize edilmiş yanıtta kod snippet'ini görün. – Rob

+0

Çok teşekkür ederim! – Dmitry

İlgili konular