2011-01-09 20 views
2

Wenn ich einen View-Controller, die zwei Protokolle implementiert:XCode/IOS Delegierten

@interface CustomerOperationsViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>

Gibt es eine einfache Möglichkeit, die erforderlichen Rückrufe für die Protokolle zu erstellen? Vielleicht eine XCode-Verknüpfung für Implementierungsmethoden? Ich gehe jedes Mal zur Dokumentation.

Verwandte, ist es möglich, den Delegaten in eine andere Datei als den Eigentümer der Datei zu setzen? Ich sehe nicht, wie man vom Benutzeroberflächenelement in eine andere Klasse als den Dateieigner zieht ...

Antwort

3

Willkommen bei XCode, einem der frustrierendsten IDEs auf dem Markt. Es gibt keine besonders einfache Möglichkeit, Callbacks vorzufüllen, obwohl sie in CodeSense durchkommen sollten. Sie könnten aus den Header-Dateien kopieren/einfügen, aber Sie müssen immer noch einige Sachen manuell bearbeiten.

Zu Ihrer zweiten Frage: Ja - Ihr Delegierter muss nicht der Eigentümer der Datei sein, aber normalerweise, wenn Sie es auf etwas anderes setzen, würden Sie es programmatisch anstatt über IB tun. Wo/was wollten Sie, dass Ihr Delegierter? Ein anderer View-Controller oder etwas anderes?

+0

Ich dachte, es in einer separaten Datei ähnlich dem ApplicationDelegate sauberer sein würde. Ich denke jedoch, dass dies keine Best Practice ist, da Sie dann keinen einfachen Zugriff auf die anderen Ausgänge haben, die im View-Controller konfiguriert sind. z.B. Ich bin am besten, nur Delegierte auf den View-Controller zu setzen? –

+1

Und ja, ich vermisse IntelliJ :) –

+0

Es ist normalerweise am besten, die Delegierten in den View-Controller zu legen, siehe Apples Vorlage UITableViewController-Datei. Aber Sie könnten sicherlich eine andere Klasse oder ein anderes Objekt verwenden, es ist einfach nicht etwas, das ich regelmäßig gemacht habe - und wenn ich es getan habe, habe ich IB nicht verwendet, um die Eigenschaft delegate zu setzen. Wenn Sie streng MVC sind, würden Sie den Delegaten in einen View-Controller stellen, zB im Fall von UIPickerView: Der PickerView selbst ist in Ihrer * Ansicht *, und die Kontrolle darüber, was in diesem Picker angezeigt wird, geht in Ihren * Controller * (mit den Daten im * Modell *, die für eine Pickerview möglicherweise keine separate Klasse sein). – lxt

4

Klicken Sie einfach bei gedrückter Befehlstaste auf die Delegate-Methode, um den Header des Stellvertreters anzuzeigen. Sie müssen also nicht im Internet (z. B. Apples Developer Site) nach den entsprechenden Dokumenten suchen. Auch in meiner Implementierung Dateien, die ich in der Regel Code wie diesen schreiben, wenn ich einen Delegaten implementieren:

#pragma mark - UITableViewDelegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // implementation here ... 
} 

#pragma mark - UITableVieWDataSource 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // implementation here ... 
} 

von Befehl-Klick auf das Pragma Zeichen Text (UITableViewDelegate/UITableViewDataSource), wird der Delegat-Header als auch gezeigt werden, weniger Navigieren zur Header-Datei der aktuellen Klasse zu Command - Klicken Sie auf das Protokoll. Kopieren Sie einfach die benötigten Methoden aus der Kopfzeile des Delegaten und fügen Sie sie ein.

Schließlich, was ist auch nützlich ist, starten Sie einfach in Xcode eingeben (jede Implementierungsdatei, die mit dem Protokoll entsprechen Sie automatisch zu vervollständigen wollen) ...

- tableView 

und drückt Flucht. Die delegierten Methoden von tableView werden angezeigt und Sie können die gewünschte Tabelle mit den Tabs auswählen, die automatisch vervollständigt werden. Gleiches gilt für Delegaten anderer Objekte.

Example