2016-04-03 4 views
1

So erstellen Sie einen benutzerdefinierten Delegaten mit einer Delegate-Methode für eine benutzerdefinierte Ansicht mit seiner (benutzerdefinierte Ansicht) -Objekt als Argument in dieser Delegate-Methode genau wie TableView CellForRowAtIndexPath: Methode?Wie erstellt man eine benutzerdefinierte Delegate-Methode wie die cellForRowAtIndexPath-Methode von tableView, die ein Argument von tableView darstellt?

Ausarbeitung der Frage mit dem genauen Problem:

Bis jetzt habe ich immer die Delegatmethoden unterschiedlicher Ansichten in UIKit vorgesehen verwendet habe Ansichten in meiner Anwendung zu konstruieren. Aber dieses Mal muss ich eine benutzerdefinierte Ansicht erstellen, aber mit dem benutzerdefinierten Delegaten und der Datenquelle. Ich habe es schon geschafft. Aber eine Frage hebt sich immer. Das heißt, wann immer ich mehrere gleiche benutzerdefinierte Ansichten in meinem ViewController brauche, wie erkenne ich sie getrennt in meinen Delegate-Methoden. Definitiv muss ich das Objekt der benutzerdefinierten Ansicht in meiner Delegate-Methode als Argument übergeben. Für z.

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

In über Delegatmethode ist Tableview Objekt ein Argument, das wir die Tableview erkennen können, wenn es mehr Tableviews auf einem Viewcontroller und dieser View-Controller wird als Delegierter all diese Tableviews gesetzt.

Das ist das eigentliche Szenario:

// 
    // ViewController.swift 
    // DemoCustomViewDelegate 
    // 
    // Created by Shubham Ojha on 4/3/16. 
    // Copyright © 2016 Shubham Ojha. All rights reserved. 
    // 

    import UIKit 

    protocol MyCustomViewDelegate { 
    func myCustomView(myCustomView: MyCustomView, didSomethingWithAString aString: String) 
    } 

    class MyCustomView: UIView { 
    var delegate: AnyObject? 
    init(frame: CGRect, andViewId viewId: String, andDelegate delegate: AnyObject) { 
    super.init(frame: frame) 
    self.delegate = delegate 
    self.doSomethingWithAString(viewId) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
} 
func doSomethingWithAString(aString: String) { 
    // do something with a string 


     delegate!.myCustomView(self, didSomethingWithAString: aString) 

} 
} 
class ViewController: UIViewController { 

var myView: MyCustomView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    myView = MyCustomView.init(frame: CGRectMake(0, 0, 50, 50), andViewId: "100", andDelegate: self) 
    //set the delegate 
    myView.delegate = self 

} 
func myCustomView(myCustomView: MyCustomView, didSomethingWithAString aString: String) { 
    //this delegate method is called but the object of myCustomView I need could not get 
    if(myCustomView.isEqual(myView)){ 
     print("Got the object")//**Does not prints, this is what I actually need to print...** 

    } 
} 

} 

Sie können den Code in Ihren Viewcontroller copy-paste und das Problem bewerten.

Antworten in Swift sind auch willkommen!

Antwort

0

Sie können wie Sie die Erweiterungen:

extension ViewController: UITableViewDelegate { 
// You extension to the UITableViewDelegate class 
} 
2

ist es das, was Sie meinen?

protocol MyCustomViewDelegate { 
    func myCustomView(myCustomView: MyCustomView, didSomethingWithAString aString: String) 
} 

class MyCustomView: UIView { 
    var delegate: MyCustomViewDelegate? 

    func doSomethingWithAString(aString: String) { 
     // do something with a string 

     // inform the delegate 
     delegate?.myCustomView(self, didSomethingWithAString: aString) 
    } 
} 
+0

In - (UITableViewCell *) Tabellenansicht: (UITableView *) Tabellenansicht cellForRowAtIndexPath: (NSIndexPath *) indexPath; Methode Das TableView-Objekt wird im ViewController erstellt, aber hier wird das myCustomView-Objekt innerhalb der MyCustomView-Klasse übergeben. –

+0

Ich verstehe nicht, was Sie mit Ihrem Kommentar meinen :) –

+0

Ich möchte dieses MyCustomView-Objekt von diesem ViewController initialisiert werden, die MyCustomViewDelegate entspricht, wie im Fall von TableView –

0
protocol MyCustomViewDelegate { 
    func myCustomView(myCustomView: MyCustomView, didSomethingWithAString aString: String) 
} 

class MyCustomView: UIView { 
    var delegate: MyCustomViewDelegate? 

    func doSomethingWithAString(aString: String) { 
    // do something with a string 

     if let delegate = delegate { 
      delegate.myCustomView(self, didSomethingWithAString: aString) 
     } 
    } 
} 


class ViewController: UIVIewController { 

    var myView: MyCustomView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     myView = MyCustomView() 

     //set the delegate 
     myView.delegate = self 

    } 
} 

//implement the delegate 
extension ViewController: MyCustomViewDelegate { 
    func myCustomView(myCustomView: MyCustomView, didSomethingWithAString aString: String) { 
     //get the string from delegation 
    } 
} 
+0

In der Erweiterung ruft die myCustomView-Methode während des Debuggens keinen Aufruf ab. –

+0

Wann rufen Sie "DoSomethingWithAString" aus dem CustomView? nach oder vor dem Delegieren? – ilan

+0

Ich kann den Delegaten aufrufen, aber ich bekomme nicht das gleiche Objekt "myView", das ich in der ViewDidLoad-Methode initialisiere, wenn (myCustomView.isEqual (myView)) { print ("Habe das Objekt") // I Ich bekomme das Objekt hier nicht innerhalb der Delegate-Methode. } –

1

Der Code gepostet Sie ist richtig. Wenn in Ihrem ViewController Sie etwas tun, wie

let myView = MyCustomView() 
myView.delegate = self 

Sie zum MyCustomView Objekt erzählt self als delegate zu nennen.

Also, wenn MyCustomView diesen Code

delegate!.myCustomView(self, didSomethingWithAString: aString) 

Es nennt dies in Ihrem Code

func myCustomView(myCustomView: MyCustomView, didSomethingWithAString aString: String) { 
    //this delegate method is called but the object of myCustomView I need could not get 
    if(myCustomView.isEqual(myView)){ 
     print("Got the object")//**Does not prints, this is what I actually need to print...** 

    } 
} 

wo myCustomView gleich myView ausführt. Sie sollten sie vergleichen, indem Sie den Operator == statt isEqual verwenden.

+0

Es gibt diesen Fehler zurück, wenn ich beide mit "==", schwerwiegender Fehler vergleichen: unerwartet gefunden Null beim Entpacken ein optionaler Wert (lldb) –

+0

Sind Sie sicher, dass Sie den exakt gleichen Code verwenden? Es sollte keinen Fehler zurückgeben. Es sollte nicht kompilieren, wenn das der Fall ist. O.o –

+0

Es kompiliert korrekt, aber zur Laufzeit wirft es einen solchen Fehler. –

Verwandte Themen