2010-12-13 4 views
12

Hey alle; Ich überarbeite gerade ein paar View-Controller, die ein paar IBOutlet s und IBAction Methoden teilen. Ich habe die Outlet-Deklarationen und die IBAction-Methode in eine Superklasse verschoben und diese aus den Unterklassen herausgeschnitten.Wie kann ich auf IBOutlets zugreifen, die in der Superklasse deklariert sind?

Jetzt, wenn ich den Interface Builder öffne, finde ich, dass ich die in der Oberklasse deklarierten Ausgänge oder Aktionen nicht sehen kann. Die Verbindungen bestehen immer noch, da ich sie vor dem Refactoring verdrahtet habe, aber sie sind ausgegraut. (Es ist wichtig zu beachten, dass die Verbindungen auch funktionieren, wie meine Aktion auf Knopfdruck ausgelöst wird, und meine Steckdosen werden ordnungsgemäß geändert.)

Die Frage ist, wie kann ich Interface Builder zu erkennen, Outlets von einer Oberklasse? Ist das möglich und wenn nicht, was empfehlen Sie?

(Just for fun, hier ist meine Super Header-Datei :)

@interface TFMainViewController : UIViewController { 
    UIImageView *logoImage, *thinkfunImage; 
    UIButton *buyFullButton;   
} 

@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage; 
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton; 

-(IBAction) buyFullVersion; 

@end 

EDIT: falls jemand fragt sich, ich bin mit Xcode und IB 3.2.5, mit dem iOS 4.2 SDK.

+0

Haben Sie jemals herausgefunden, ob dies möglich ist oder nicht? Ich hatte gehofft, dasselbe zu tun, aber IB scheint die Eigenschaft nicht zu erkennen, es sei denn, ich habe sie in der Unterklasse neu deklariert? – Rog

+0

irgendwelche Nachrichten zu diesem Einzelteil? Ich stoße hier auf dasselbe Problem - diesmal mit der InstallerPlugin-Superklasse (InstallerPane), die nicht meine ist, also kann ich sie nicht ändern --- nur Dokumentation sagt, dass ich meine .xib mit einigen Eigenschaften der Superklasse verbinden muss !! ! Wie man? –

Antwort

18

Ich wusste nicht, dass es sogar bis vor einer Stunde möglich war, sich mit Oberklassen in Interface Builder zu verbinden. Da dies die einzige Frage war, die ich in Bezug darauf finden konnte, füge ich meine Antwort hinzu, obwohl diese Frage alt ist. Meine Antwort ist in Bezug auf Xcode 4, nicht Xcode 3.

Soweit ich sagen kann, können Sie nicht mit Outlets in einer Superklasse mit dem Assistenten-Editor verbinden, aber Sie können es tun, indem Sie auf "Besitzer der Datei "in IB. Das sollte alle Ausgänge in Utilities-> Connections Inspector zeigen. Sie können dann Strg + Klicken Sie auf die Steckdose im Inspektor (klicken Sie auf das '+' Zeichen), und ziehen Sie es auf Ihre Ansicht in IB.

+1

Dies sollte die akzeptierte Antwort sein. Vielen Dank! – NathanAldenSr

+1

Oder navigieren Sie einfach mit Cmd-Click zur Superklasse im Assistenten-Editor, dann können Sie von der Klasse zu IB oder umgekehrt ziehen, um Steckdosen zu verbinden oder neue zu erstellen. –

1

Ich bin mir ziemlich sicher, dass IB nur auf die tatsächliche Klasse schaut, die Sie verwenden, um Verkaufsstellen zu finden, und nicht auf Superklassen. Ich denke, dass die einfachste Lösung wäre, die Instanzvariablendeklarationen in der Oberklasse zu belassen, aber die Zeilen in jeder Unterklasse zu duplizieren.

+0

Tatsächlich wird Interface Builder * Eigenschaften von Superklassen auflisten, aber sie müssen in der Header-Datei (nur der Superklasse) deklariert werden, und diese Header muss von der Subklasse importiert werden (wie Kendall sagte). – Brian

2

IB sollte Outlets von Superklassen sehen können, ich habe dies eine Reihe von Zeiten ohne Probleme getan. Bist du sicher, dass du die Oberklasse korrekt importierst (mit #import anstelle von @class)? IB braucht einen Weg, um zurück zur Superklasse zu gelangen.

+0

Kendall, wenn du dir die andere Antwort ansiehst, duplizierst du irgendetwas, oder ist die gesamte Deklaration in der Oberklasse? Ich verwende '# import' und habe Zugriff auf die Eigenschaften in den Unterklassen, daher weiß ich, dass der Header-Import funktioniert. –

+0

Ich habe gerade ein Testprojekt dafür erstellt - und es funktioniert nicht. Ab Xcode 7.x - IB zeigt nur IBOutlets der tatsächlichen Klasse an, die für ein Objekt deklariert wurde, nicht die seiner Oberklassen. –

+0

Ich spielte gerade mit diesem in Xcode 7.3 in Swift und es funktioniert immer noch gut. Ich konnte ein IBOutlet in der Oberklasse deklarieren lassen und entweder von dort nach IB ziehen oder von IB zum Ausgang ziehen, um es zu verbinden. Der Assistent-Editor zeigt die Oberklasse nicht im Bereich Automatisch an, aber Sie können dorthin navigieren, und IB zeigt den Ausgang als aus der Unterklasse kommend (was technisch korrekt ist). @SamRitchie - Dupliziere nichts, nur die Steckdose in der Oberklasse, nicht in der Unterklasse. –

0

Ich mache das in XCode 3.2.6. Ich begann mit Steckdosen, die mit einer Klasse verbunden waren, und machte dann eine Unterklasse mit zusätzlichen Steckdosen. Als ich die File Owner-Klasse in die Unterklasse änderte, zeigte IB die Outlets der Superklasse als ausgegraut an. Ich wechselte den Besitzer der Datei in die Oberklasse, dann zurück in die Unterklasse und nun sind alle Ausgänge nicht ausgegraut.

0

Der einfachste Weg: Erstellen Sie Schnittstellen- und Implementierungsdateien für Ihre Unterklasse (n)!
Perfektes Beispiel: Juggleware's genial ShadowButton Subclass von UIButton.

Stellen Sie sicher, dass Sie die .h & .m-Dateien in Ihrem Projekt erstellen. HINWEIS: #import müssen die Header-Dateien überhaupt nicht, da dies einfach eine Klasseninstanz von UIButton ist.

In Interface Builder:

  1. Wählen Sie das Element Sie, die zu verbinden.
  2. Zum Dienstprogramme ->Identität Inspector
  3. Ändern Sie die Klasse zu Unterklasse (oder übergeordnete Klasse). Hinweis: Sie müssen möglicherweise den Namen Ihrer Unterklasse eingeben und die EINGABETASTE drücken.

Sie sind fertig!

Auch wenn Sie eine Basisklasse deklariert haben (UIButton) als IBOutlet in der Header-Datei wie so ...

// YourViewController.h 

@interface YourViewController : UIViewController { 

IBOutlet UIButton *mybutton; 
} 

... die Klasse, die Sie im Interface Builder (ShadowButton) festgelegt haben, überschreiben es, da es in der Ansichtsebene ist.

Das Beste an diesem Ansatz ist, dass Ihr Code keine unordentlichen Abhängigkeitsprobleme aufweist.

3

Durch den Wechsel zwischen Super- und Subklasse im Identity Inspector können Sie Ihre Steckdosen über die Klassen hinweg verbinden. Das einzige Problem, das ich fand, ist, wenn Sie versuchen, dies mit einer UITableViewCell und seiner Unterklasse zu tun. Ich wollte die standardmäßigen TextLabel- und DetailTextLabel-Instanzen den Labels zuweisen, die ich in Interface Builder erstellt habe. Die Problemumgehung besteht darin, Ersatzbezeichnungen zu erstellen und dann die Getter so zu überschreiben, dass sie stattdessen auf diese verweisen.

11

Die Lösung für das Problem mit dem IBOutlet .. ist der Klassentyp auf die Basisklasse in der Identität Inspektoren

enter image description here

Verbindung mit Strg + Drag & Drop und

enter image description here zu ändern

es Änderung an der Kind-Klasse zurück

enter image description here

Dies funktioniert für mich

BTW: i Xcode verwendet 6

+1

Ich habe das gleiche Problem. versucht, dass, mit NSCollectionViewItem, so kann ich die TextField Steckdose verbinden, aber immer noch nicht funktioniert .. – pvinis

0

Auf dem Projekt, das ich zur Zeit arbeite, haben wir ein BaseViewController mit einem UIScrollView als IBOutlet und Griffe Tastatur Aussehen/Verschwinden Ereignisse und gleitet der Inhalt entsprechend. Zuerst konnte ich keine Verbindung zu diesen IBOutlet, als das Problem wie folgt gelöst, die Sosily Antwort ähnelt:

  • BaseViewController ein IBOutlet, genannt contentScrollView. Ich kann 5 zuvor verbundene Auslässe sehen, die UIScrollViews auf anderen UIViewControllers sind, von Menschen, die zuvor an dem Projekt gearbeitet

  • Ich versuchte, meine UIScrollView als contentScrollView zu verbinden. Obwohl meine UIViewController eine Unterklasse von BaseViewController ist, kann ich sie nicht verbinden.

  • Ich habe versucht, bereits verbunden UIScrollViews als contentScrollView zu verbinden. Obwohl alle UIViewControllers Unterklassen von BaseViewController sind, kann ich sie auch nicht erneut verbinden. Also habe ich nach einem Trick gesucht.

  • ich die gleichen contentScrollViewIBOutlet auf meinem eigenen UIViewController erstellt habe, verbunden, um die scrollView meinen eigenen contentScrollView Ausgang und entfernt das, die ich gerade erstellt habe.

  • Nun ist der scrollView als contentScrollView mit dem Eigentümer der Datei verbunden, aber der einzige contentScrollView gehört zu der BaseViewController. Getestet und verifiziert, dass Tastaturereignisse korrekt behandelt werden.

0

Ich lief in ein ähnliches Problem mit einer übergeordneten Klasse, aber es war aufgrund eines Fehler in Xcode (8.2), in dem Interface Builder Steckdosen nicht im Anschluss Inspektoren zeigen, wenn diese Ausgänge mit einem _Nullable erklärt wurden Typ Anmerkung für Swift-Kompatibilität.

Mithilfe der Klammern nullable in der @ Eigenschaft scheint das Problem zu umgehen.

Dieser Xcode-Bug scheint Outlets in jeder Klasse (dh nicht nur Superklassen) zu beeinflussen.

0

Ich hatte das gleiche Problem, und es stellte sich heraus, dass es war, weil ich in der Oberklasse die IBOutlets als "_Nullable" deklariert hatte. Beispiel:

@property (nonatomic, strong) IBOutlet UITableView *_Nullable mySuperTableView; 

Wenn ich die _Nullable entfernt, plötzlich tauchte die IBOutlets in IB und alles war wieder gut. (Ich hatte sie nur auf _Nullable gesetzt, weil Xcode sich beschwerte "Zeiger fehlt ein NULL-Typ-Spezifizierer" ... (weiß nicht warum).)

Verwandte Themen