Come IBOutlets di accesso dichiarato in superclasse?
-
09-10-2019 - |
Domanda
Attualmente sto refactoring un paio di controller di vista che condividono alcuni IBOutlet
s e metodi IBAction
. Ho spostato le dichiarazioni di uscita e il metodo IBAction
in una superclasse, tagliando questi fuori delle sottoclassi.
Ora, quando apro Interface Builder, trovo che non riesco a vedere le prese o le azioni dichiarate nella superclasse. Esistono le connessioni ancora, come li avevo cablato prima del refactoring, ma sono in grigio. (E 'importante notare che i collegamenti anche il lavoro, come i miei fuochi d'azione su pressione di un pulsante, e le mie uscite vengono modificati in modo corretto.)
La domanda è: come posso ottenere la creazione di interfacce per riconoscere prese da una superclasse? Questo è possibile, e, in caso contrario, che cosa tutto consigliate?
(Solo per divertimento, ecco il mio file di intestazione superclasse:)
@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:. Nel caso qualcuno sta chiedendo, sto usando Xcode e IB 3.2.5, con l'iOS 4.2 SDK
Soluzione
Non ho capito che era anche possibile collegarsi a superclassi in costruttore di interfaccia fino a circa un'ora fa. Dal momento che questa era l'unica domanda che ho trovato per quanto riguarda come fare questo, io aggiungo la mia risposta, anche se questa domanda è vecchia. La mia risposta è per quanto riguarda Xcode 4, non Xcode 3.
Per quanto ne so, non è possibile connettersi a punti vendita in una superclasse utilizzando l'assistente al montaggio, ma è possibile farlo cliccando su "Manuale di file" in IB. Questo dovrebbe mostrare tutti i punti vendita in Utilità-> Connessioni ispettore. È possibile poi Ctrl + Clicca sulla presa della finestra di ispezione (cliccare sul segno '+'), e trascinarlo verso la visualizzazione in IB.
Altri suggerimenti
La soluzione per il problema con l'IBOutlet .. è quello di cambiare il tipo di classe alla classe di base nella finestra di ispezione identità
connettersi utilizzando Control + drag and drop e
cambiare di nuovo alla classe figlio
Questo funziona per me
A proposito: ho usato Xcode 6
IB dovrebbe essere in grado di vedere prese da superclassi, ho fatto un certo numero di volte senza problemi. Sei sicuro che si sta importando la superclasse correttamente (utilizzando # import, invece di @class)? IB ha bisogno di qualche modo per tenere traccia di nuovo alla superclasse.
Il passaggio tra il super e sottoclasse nella finestra di ispezione identità consente di collegare le prese attraverso le classi. L'unico problema che ho trovato è quando si tenta di fare questo con un UITableViewCell e la sua sottoclasse. Ho voluto riassegnare le istanze predefinite TextLabel e detailTextLabel alle etichette che creo in Interface Builder. La soluzione è creare etichette di sostituzione e quindi sostituire i getter a scegliere questi invece.
Sono abbastanza sicuro che IB guarda solo alla classe reale che si sta utilizzando per trovare sbocchi, e non a superclassi. Penso che la soluzione più semplice sarebbe quella di lasciare le dichiarazioni di variabile di istanza nella superclasse, ma duplicare le linee @property
in ogni sottoclasse.
Sto facendo questo in XCode 3.2.6. Ho iniziato con uscite collegate a una classe, e poi fatto una sottoclasse con prese supplementari. Quando ho cambiato classe proprietario del file alla sottoclasse, IB ha mostrato i punti vendita della superclasse come in grigio. Sono passato proprietario del file alla superclasse, poi di nuovo alla sottoclasse e ora tutti i punti vendita non sono mostrando grigio.
Il modo più semplice: Creare file di implementazione di interfaccia e per la vostra sottoclasse (es)
Esempio perfetto: ShadowButton href="https://stackoverflow.com/users/326398/juggleware"> Juggleware di sottoclasse di UIButton.
Assicurarsi di creare i file .h & .m nel progetto.
NOTA: Non v'è alcuna necessità di #import
i file di intestazione a tutti dal momento che questo è semplicemente un istanza della classe di UIButton.
Nel Interface Builder :
- Selezionare l'elemento che si cui connettersi.
- Vai a Utilità -> Identità Ispettore
- cambiare la classe al vostro sottoclasse (o superclasse). NOTA:. Potrebbe essere necessario digitare il nome della classe e premere INVIO
Il gioco è fatto!
Anche se si è dichiarata una classe di base (UIButton) come IBOutlet nel file di intestazione in questo modo ...
// YourViewController.h
@interface YourViewController : UIViewController {
IBOutlet UIButton *mybutton;
}
... la classe che hai impostato in Interface Builder (ShadowButton) sovrascriverà dal momento che è nel livello di visualizzazione.
La parte migliore di questo approccio è che il codice non ha problemi di dipendenza disordinata.
Il progetto Attualmente sto lavorando, abbiamo un BaseViewController
con un UIScrollView
come eventi aspetto IBOutlet
e maniglie tastiera / scomparsa e scivoli il contenuto di conseguenza. In un primo momento, non ho potuto connettersi a tale IBOutlet
, che ha risolto il problema come questo, che è simile alla risposta di Sosily:
-
BaseViewController
ha unIBOutlet
, chiamatocontentScrollView
. Vedo 5 punti precedentemente collegati, che sonoUIScrollViews
su altriUIViewControllers
, create da persone che in precedenza hanno lavorato al progetto -
Ho provato a collegare il mio
UIScrollView
comecontentScrollView
. Anche se il mioUIViewController
è una sottoclasse diBaseViewController
, non riesco a collegarlo. -
I tentato di connettersi
UIScrollViews
già collegato comecontentScrollView
. Anche se tuttiUIViewControllers
sono sottoclassi diBaseViewController
, non riesco a collegarmi di nuovo, pure. Così, ho iniziato a cercare un trucco. -
Ho creato lo stesso
contentScrollView
IBOutlet
per conto mioUIViewController
, collegato ilscrollView
alla mia presa dicontentScrollView
e rimosso quello che ho appena creato. -
Ora la ScrollView è collegata come
contentScrollView
al proprietario del file, ma l'unicocontentScrollView
appartiene allaBaseViewController
. Testato e verificato che gli eventi di tastiera vengono gestiti correttamente.
mi sono imbattuto in un problema simile con una superclasse, ma è stato a causa di un bug in Xcode (8.2) dove Interface Builder non mostra punti vendita nel collegamento ispettore se tali punti sono stati dichiarati con un tipo di annotazione _Nullable
per Swift compatibilità.
Utilizzando nullable
all'interno @ parentesi appare di proprietà per aggirare il problema.
Questo bug Xcode sembra interessare punti vendita in qualsiasi classe (es. Non solo superclassi).
Ho avuto lo stesso problema, e si scopre che era perché nella superclasse ho avuto le IBOutlets dichiarati come "_Nullable". Esempio:
@property (nonatomic, strong) IBOutlet UITableView *_Nullable mySuperTableView;
Quando ho tolto il _Nullable, improvvisamente i IBOutlets riapparve in IB e tutto era di nuovo bene. (Li avevo impostato solo per _Nullable perché Xcode si lamentava "puntatore manca un tipo di supporto di valori Null identificatore" ... (non so perché).)