2010-12-13 2 views
12

Ciao a tutti; Attualmente sto refactoring un paio di controller di visualizzazione che condividono alcuni metodi IBOutlet se IBAction. Ho spostato le dichiarazioni di uscita e il metodo IBAction in una superclasse, tagliandole fuori dalle sottoclassi.Come accedere a IBOutlets dichiarati nella superclasse?

Ora, quando apro Interface Builder, trovo che non riesco a vedere le prese o le azioni dichiarate nella superclasse. Le connessioni esistono ancora, perché le avevo cablate prima del refactoring, ma sono disattivate. (È importante notare che anche le connessioni FUNZIONANO, poiché la mia azione si attiva premendo un pulsante e le mie prese sono modificate correttamente.)

La domanda è: come posso ottenere il costruttore dell'interfaccia per riconoscere i punti vendita da una superclasse? È possibile e, in caso contrario, cosa consiglieresti?

(Solo per divertimento, ecco la mia superclasse file di intestazione :)

@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.

+0

hai mai capito se questo è possibile o no? Speravo di fare lo stesso, ma IB non sembra riconoscere la proprietà a meno che non la ridichiarò nella sottoclasse? – Rog

+0

ci sono novità su questo articolo? Sto incontrando lo stesso problema qui -questa volta con Installer Plugin superclass (InstallerPane) che non è mio, quindi non posso modificarlo --- solo la documentazione dice che devo collegare il mio .xib ad alcune proprietà della superclasse !! ! Come? –

risposta

18

Non mi ero reso conto che fosse possibile collegarsi anche alle superclasse nel generatore di interfacce fino a circa un'ora fa. Poiché questa era l'unica domanda che potevo trovare su come fare, aggiungerò la mia risposta, anche se questa domanda è vecchia. La mia risposta riguarda Xcode 4, non Xcode 3.

Per quanto posso dire, non è possibile connettersi alle prese in una superclasse usando l'editor di assistente, ma è possibile farlo facendo clic su "Proprietario file "in IB. Dovrebbe mostrare tutti i punti vendita in Utilities-> Connections Inspector. Puoi quindi fare CTRL + clic sulla presa nell'ispettore (fai clic sul segno "+") e trascinalo sulla tua vista in IB.

+1

Questa dovrebbe essere la risposta accettata. Grazie! – NathanAldenSr

+1

Oppure naviga semplicemente con Cmd: fai clic sulla superclasse nell'editor degli assistenti, quindi puoi trascinare dalla classe in IB o viceversa per connettere i punti vendita o crearne di nuovi. –

1

Sono abbastanza sicuro che IB guarda solo alla classe reale che stai utilizzando per trovare punti vendita e non alle superclassi. Penso che la soluzione più semplice sarebbe lasciare le dichiarazioni delle variabili di istanza nella superclasse, ma duplicare le linee @property in ciascuna sottoclasse.

+0

In realtà, Interface Builder * * * elenca le proprietà delle superclassi, ma devono essere dichiarate nel file di intestazione (solo della superclasse) e quell'intestazione deve essere importata dalla sottoclasse (come diceva Kendall). – Brian

2

IB dovrebbe essere in grado di vedere punti vendita da superclassi, l'ho fatto un certo numero di volte senza problemi. Sei sicuro di aver importato correttamente la superclasse (usando #import anziché @class)? IB ha bisogno di un modo per rintracciare la superclasse.

+0

Kendall, dando un'occhiata all'altra risposta, stai duplicando qualcosa, o è l'intera dichiarazione nella superclasse? Sto usando '# import' e ho accesso alle proprietà all'interno delle sottoclassi, quindi so che l'importazione dell'intestazione funziona. –

+0

Ho appena creato un progetto di test per questo - e non funziona. A partire da Xcode 7.x - IB mostra solo IBOutlet della classe effettiva dichiarata per un oggetto, non quelli delle sue superclassi. –

+0

Stavo solo giocando con Xcode 7.3 in Swift e funziona ancora bene. Sono stato in grado di dichiarare un IBOutlet nella superclasse e trascinarlo da IB a IB o trascinarlo da IB alla presa per collegarlo. L'editor dell'Assistente non mostra la superclasse nella sezione Automatica ma puoi navigare lì, e IB mostra la presa come proveniente dalla sottoclasse (che è tecnicamente accurata). @ SamRitchie - non duplicare nulla, basta avere l'uscita nella superclasse, non nella sottoclasse. –

0

Sto facendo questo in XCode 3.2.6. Ho iniziato con le prese collegate a una classe, quindi ho creato una sottoclasse con altri punti vendita. Quando ho modificato la classe Owner del file nella sottoclasse, IB ha mostrato le uscite della superclasse in grigio. Ho passato il proprietario del file alla superclasse, quindi di nuovo alla sottoclasse e ora tutte le prese non sono visualizzate in grigio.

0

Il modo più semplice: creare file di interfaccia e implementazione per la sottoclasse (i)!
Esempio perfetto: Juggleware's impressionante ShadowButton Subclass di UIButton.

Assicurarsi di creare i file .h & .m nel progetto. NOTA: non è necessario inserire #import i file di intestazione poiché questa è semplicemente un'istanza della classe di UIButton.

In Interface Builder:

  1. Selezionare l'elemento che si cui connettersi.
  2. Vai Utilità ->Identità ispettore
  3. cambiare la classe al vostro sottoclasse (o superclasse). NOTA: potrebbe essere necessario digitare il nome della sottoclasse 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) sovrascrive poiché è nel livello vista.

La parte migliore di questo approccio è che il codice non presenta problemi di dipendenza disordinati.

3

Il passaggio tra super e sottoclasse nell'ispettore identità consente di collegare le prese tra le classi. L'unico problema che ho riscontrato è quando si tenta di farlo con un UITableViewCell e la sua sottoclasse. Volevo riassegnare le stringhe textLabel e detailTextLabel predefinite alle etichette che creo in Interface Builder. La soluzione alternativa è creare etichette sostitutive e quindi sostituire i getter in modo che puntino a questi invece.

11

La soluzione per il problema con l'IBOutlet .. è quello di cambiare il tipo di classe alla classe di base nella finestra di ispezione identità

enter image description here

connettersi utilizzando Control + drag and drop e

enter image description here

cambiamento di nuovo alla classe figlia

enter image description here

questo funziona per me

BTW: ho usato Xcode 6

+1

ho lo stesso problema. l'ho provato, con NSCollectionViewItem, così posso connettere l'uscita textField, ma ancora non funziona .. – pvinis

0

Sul progetto Attualmente sto lavorando, abbiamo un BaseViewController con un UIScrollView come IBOutlet e maniglie tastiera aspetto/eventi scomparsa e diapositive la contenuto di conseguenza. In un primo momento, non ho potuto connettersi a tale IBOutlet, rispetto risolto il problema come questo, che è simile alla risposta di Sosily:

  • BaseViewController ha un IBOutlet, chiamato contentScrollView. Vedo 5 punti precedentemente collegati, che sono UIScrollViews su altri UIViewControllers, create da persone che in precedenza hanno lavorato al progetto

  • ho provato a collegare il mio UIScrollView come contentScrollView. Sebbene il mio UIViewController sia una sottoclasse di BaseViewController, non riesco a collegarlo.

  • Ho provato a collegare già collegato UIScrollViews come contentScrollView. Sebbene tutte le UIViewControllers siano sottoclassi di BaseViewController, non riesco a collegarle di nuovo. Quindi, ho iniziato a cercare un trucco.

  • ho creato lo stesso contentScrollViewIBOutlet per conto mio UIViewController, collegato il scrollView alla mia contentScrollView presa e rimosso quello che ho appena creato.

  • Ora scrollView è connesso come contentScrollView al proprietario del file, ma l'unico contentScrollView appartiene allo BaseViewController. Testato e verificato che gli eventi della tastiera siano gestiti correttamente.

0

mi sono imbattuto in un problema simile con una superclasse, ma era a causa di un bug in Xcode (8.2) dove Interface Builder non mostra punti vendita nella connessione ispettore se quei punti sono stati dichiarati con un _Nullable scrivi annotazioni per la compatibilità Swift.

Utilizzare nullable all'interno delle parentesi di proprietà @ per aggirare il problema.

Questo bug Xcode sembra influenzare le prese in qualsiasi classe (ad esempio non solo le superclassi).

0

Ho avuto lo stesso problema, e si è scoperto perché nella superclasse avevo le IBOutlets dichiarate 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 solo impostati su _Nullable perché Xcode si stava lamentando "il puntatore manca un identificatore del tipo nullability" ... (non so perché))