2012-03-25 13 views
9

Sto cercando di imparare il monotouch al momento e seguendo il libro monotouch di Mike BlueStein. Non è un brutto libro, ma è un po 'datato da quando xcode 4 (credo) e una versione più recente su monotouch è uscita.Come aggiungere una vista personalizzata a una vista definita del file XIB in monotouch

Ad ogni modo, nel mio progetto ho un controller e un file xib. Ho anche una vista personalizzata (ad es. Myview: UIView), che sovrascrive il metodo di disegno. Voglio mostrare la mia vista personalizzata accanto o sopra la vista definita nel file xib. Come faccio a fare questo?

Nel controller, se sovrascrivo il metodo LoadView e imposta la vista su un'istanza della mia vista personalizzata, posso vederlo, ma perdo tutto ciò che è definito nel file xib. Se provo ad aggiungere come sottovista, non appare affatto.

Cosa mi manca? Se la domanda non è chiara, per favore chiedimi, così posso chiarire.

Cheers.

+0

Questo [domanda SO] (http://stackoverflow.com/questions/863321/iphone -how-to-load-a-view-using-a-nib-file-creato-con-interface-builder) potrebbe aiutare – tipycalFlow

risposta

22

seguire la seguente procedura per utilizzare una visualizzazione personalizzata in un XIB:

In primo luogo, decorare la vista con il RegisterAttribute:

[Register("MyView")] 
public class MyView : UIView 
{ 
} 

e attuare il seguente costruttore:

public MyView(IntPtr handle) : base(handle) {} 

Questo costruttore è necessario quando il runtime cercherà di ricreare la vista dopo che è stata distrutta da un avviso di memoria. Dopo aver creato la classe personalizzata:

  • Aprire il XIB in Xcode (sempre con un doppio clic su di esso attraverso MonoDevelop) e aggiungere un UIView dove vuoi.
  • In Xcode, impostare quella classe di UIView a MyView (o qualsiasi altro nome che si passa al RegisterAttribute):

Custom class for custom view

  • Compile-Run.

EDIT:

non hanno la precedenza LoadView per i controller che vengono caricati da un XIB. LoadView serve per creare la vista del controller quando la vista di quel controller non viene caricata da un XIB.

+0

Cheers. Risposta perfetta –

3

Grazie Dimitris, ottima risposta.

Per coloro che si confondono come me, questa è la procedura simplist per aggiungere e utilizzare un file Xib come parziale/visualizzazione secondaria:

  1. aggiungere un nuovo file Xib in MonoDevelop (cioè LoginView.xib)
  2. Aggiungi una nuova classe (parziale), questa sarà la classe personalizzata (il file Code-behind diciamo) per la vista.Assegnare un nome qualsiasi "LoginView.cs")
  3. Aggiungere l'attributo (RegisterAttribte) e lo Constrctor come exaplain di cui sopra da Dimitris.
    1. Fare doppio clic su LoginView.xib per aprirlo in XCode IB. Quindi modificare la Custom Class attributo del file XI ter punti al "file code-behind" (cioè LoginView.cs)
  4. Aggiungi eventuali punti o azione se avete bisogno. MonoDevelop genererà un file .designer e lo collegherà al tuo file code-behind, questo è dove puoi vedere tutte le tue uscite e azioni.
  5. Nei vostri controller in cui si desidera aggiungere questo punto di vista, caricare il file .xib come segue:

    vista var = NSBundle.MainBundle.LoadNib ("LoginView", questo, null); LoginView loginView = Runtime.GetNSObject (views.ValueAt (0)) come LoginView; mainLayout.AddSubview (loginView); // dove mainLoyout è la pagina predefinita nel mio ViewController principale

Queste tre linee sono basate su risposta flexaddicted here

Problemi correlati