2016-04-11 5 views
1

Ich möchte einen Delegaten für die Kommunikation zwischen einem View-Controller und einer Klasse einrichten. Aber es gibt keinen Delegierten, weil es keinen prepareForSegue Verbindungstyp gibt. Wo sollte ich den Delegierten setzen und wie soll ich den Code umsetzen? HierStellvertreter zwischen einem View-Controller und einer Klasse

ist der Code:

Protokoll in Swift:

@objc public protocol translationMadeDelegate: class { 
    func didGetTranslation(translation:CGPoint) 
} 

Delegierter Initialisierung in viewDidLoad in Swift:

var delegate:translationMadeDelegate? 
let trans:CGPoint = CGPointMake(100, 100) 
self.delegate!.didGetTranslation(trans) 

Objective-C-Klasse delegieren Anruf

- (void)didGetTranslation:(CGPoint *)translation { 
    NSLog(@"cgpointed"); 
} 
+0

In Ihrem Code gehen sollte, 'delegate' wird gleich Null sein und die App abstürzt. – ryantxr

+0

Normalerweise wird der Delegat in oder nach der 'init'-Methode der Klasse gesetzt. – vadian

Antwort

0

Im Allgemeinen muss Ihre Objective-C-Klasse etwas über Ihre Swift-Klasse wissen, die das TranslationMadeDelegate enthält.

Bei der Zuweisung Ihrer Swift-Klasse kann sich Ihre Objective-C-Klasse als Delegierter ausgeben. Dies ähnelt einem UIViewController, der eine UITableView-Eigenschaft hat und sich selbst als Delegate/Datenquelle definiert.

2

einen Blick auf dieses Code-Snippet Nehmen Sie es präsentiert, wie die Umsetzung

//Class 

protocol translationMadeDelegate: class { 
    func didGetTranslation(translation : CGPoint) 
} 

class someClass { 
    weak var delegate: childViewControllerDelegate? 

    func someMethodThatCallsDelegate(){ 
     let point = CGPoint(x: 10, y: 20) 
     self.delegate?.didGetTranslation(point); 
    } 
} 


//ViewController 

class parentViewController: UIViewController, translationMadeDelegate { 
    var classObj : someClass! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.classObj = someClass() 
     self.classObj.delegate = self 
    } 
    func didGetTranslation(translation : CGPoint){ 
     //do some stuff with translation 
    } 
} 
+0

Hallo. Danke für Ihre Antwort. Aber ich möchte, dass der Delegat und der Delegat-Aufruf umgekehrt werden. Also wird das Protokoll in Viewcontroller anstelle von someClass sein. –

Verwandte Themen