Interface Builder - Sottoclasse UIViewController non riconosciuta come sottoclasse

StackOverflow https://stackoverflow.com/questions/412083

  •  03-07-2019
  •  | 
  •  

Domanda

Sto lavorando a una semplice app per iPhone.

Ho 1 UINavigationController e 2 sottoclassi di UIViewController.

Ho un file MainWindow.xib, un PersonListView.xib e un PersonDetailView.xib.

MainWindow.xib ha UINavigationController con la vista collegata al file PersonListView.xib.

PersonListView.xib ha il proprietario del file elencato come classe PersonListViewController.

Ho alcuni pulsanti su PersonListView, insieme a etichette e immagini. Tutto viene visualizzato correttamente.

Quando provo a collegare un pulsante su PersonListView alla mia classe PersonListViewController, il pulsante non si attiva ....

Il risultato:   * Terminazione dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '* - [UIViewController viewDetail]: selettore non riconosciuto inviato all'istanza 0x450d50'

Se vado nella console di debug e print-object 0x450d50, ottengo:

(gdb) oggetto-stampa 0x450d50 (gdb)

Interface Builder mostra correttamente il proprietario del file come PersonListViewController, quindi perché la mia azione del pulsante (collegata al proprietario del file) andrebbe in qualche modo alla superclasse?

EDIT1: Ok, sembra che non stia ottenendo un'istanza della sottoclasse a meno che, nel mio MainWindow.xib, non abbia impostato esplicitamente la classe del controller di visualizzazione sulla mia sottoclasse.

Tuttavia, ci deve essere ancora qualcosa che mi manca, perché sicuramente dovrei essere in grado di avviare sottoclassi arbitrarie di UIViewController semplicemente scambiando il nome del file NIB dalla finestra principale?

EDIT2: (Risposta a Kevin) Non è quello che sto dicendo riguardo al contenuto di una XIB.

Ho 3 XIB:

MainWindow PeopleListView PeopleDetailView

PeopleListView e PeopleDetailView hanno ciascuno un proprietario di file associato che è una sottoclasse UIViewController corrispondente. Ovviamente, ho bisogno che i miei eventi vadano nelle classi di controller giuste mentre mi sposto da una pagina all'altra ... ma se posso usare solo un UIViewController predefinito o una sottoclasse, sarà molto più difficile?

Posso ottenere l'effetto corretto nel codice impostando manualmente UINavigationController con il root corretto, ma penso che ci dovrebbe essere un modo migliore attraverso InterfaceBuilder.

EDIT3: (a Kendall) Non sto usando una barra delle schede. Il modello è lo stesso, tuttavia, che la vista nel mio controller di navigazione deve essere collegata a una singola sottoclasse, che sembra un po 'icky.

EDIT4: (to lostintransit) PersonListViewController ha il viewDetail appropriato (IBAction); metodo. Il problema è che non riesco a trovare un modo, nel mio MainWindow.xib, di contrassegnare la vista all'interno del mio UINavigationController come " inizialmente caricare questo da PersonListView.xib, con un PersonListViewController come vista " ciò non renderebbe difficile sostituire PersonListView con PersonDetailView.

È stato utile?

Soluzione

Penso che tu stia usando una barra delle schede, giusto?

In tal caso, pensaci in questo modo. Ogni scheda definita in xib MainWindow deve essere definita come il tipo di controller di visualizzazione personalizzato, poiché quello è il tipo che la barra delle schede creerà quando viene caricata. La barra delle schede crea controller di visualizzazione per ogni scheda definita al momento del caricamento.

Non è sufficiente creare un'istanza di qualsiasi controller di visualizzazione e quindi caricare il NIB personalizzato (che è ciò che la barra delle schede che hai definito sta facendo in questo momento), perché il cablaggio nella visualizzazione personalizzata non avrà nulla a cui collegarsi .

Quindi, assicurati che ogni controller di vista definito sotto ciascuna scheda in MainWindow.xib (usa la vista ad albero in IB per esaminarlo) sia impostato sul giusto tipo UIViewController personalizzato oltre a puntare al tuo XIB personalizzato che deve anche avere il il proprietario del file è impostato sul tipo corretto (anche se questo è importante solo se si collega qualcosa al proprietario del file oltre la visualizzazione di base).

Altri suggerimenti

La modifica del nome di xib non ha assolutamente alcun effetto sul contenuto di tale xib. devi modificare il nome della classe nel pannello Informazioni se desideri cambiare la sottoclasse che stai utilizzando.

Dall'eccezione sembra che l'associazione non sia stata eseguita correttamente. La firma del metodo non sembra essere corretta a giudicare dall'eccezione. L'azione del pulsante è collegata a un metodo con tipo di ritorno IBAction? La firma del metodo dovrebbe essere

- (IBAction) methodName;

Ho avuto lo stesso errore.

Il problema è che non hai impostato la destinazione di PersonListViewController.m.

Vai alle informazioni di PersonListViewController.m, seleziona la sezione target e assicurati che sia selezionato il target della tua app.

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