Domanda

Attualmente sto refactoring un paio di controller di vista che condividono alcuni IBOutlets 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

È stato utile?

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à

entrare descrizione dell'immagine qui

connettersi utilizzando Control + drag and drop e

entrare descrizione dell'immagine qui

cambiare di nuovo alla classe figlio

entrare descrizione dell'immagine qui

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 :

  1. Selezionare l'elemento che si cui connettersi.
  2. Vai a Utilità -> Identità Ispettore
  3. 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 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. Anche se il mio UIViewController è una sottoclasse di BaseViewController, non riesco a collegarlo.

  • I tentato di connettersi UIScrollViews già collegato come contentScrollView. Anche se tutti UIViewControllers sono sottoclassi di BaseViewController, non riesco a collegarmi di nuovo, pure. Così, ho iniziato a cercare un trucco.

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

  • Ora la ScrollView è collegata come contentScrollView al proprietario del file, ma l'unico contentScrollView appartiene alla BaseViewController. 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é).)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top