Come faccio ad avere una vista in Interface Builder per caricare una visualizzazione personalizzata in un altro pennino?

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

Domanda

Sto facendo un widget personalizzato che vorrei utilizzare in più pennini. Così faccio una nuova visione pennino Screen3, aggiungere alcuni pulsanti, e ora vogliono il mio widget di UIAwesomeSauce.

Se io solo aggiungere una vista e poi cambiare la classe di identità, non ottiene i sottoelementi dal pennino UIAwesomeSauce. Stessa cosa se vado alla Biblioteca e passare a classi. Sembra solo un'UIViewController ha il campo per "Carica da pennino", che sarebbe bello.

so di poter caricare il pennino UIAwesomeSauce dal codice, ottenere gli oggetti di livello superiore, e posizionarlo a mano. Ma il punto di IB è così non c'è bisogno di mettere le cose nel codice. Ancora meglio sarebbe se potessi ottenere UIAwesomeSauce di presentarsi nella lista Biblioteca stessa.

RISOLTO - da Nimrod - continuate a leggere per SPIEGAZIONE E CODICE

In ogni caso, dood, che è grande. Posso fare le mie classi di widget ora goofy roba impressionante. Rendere il Fileowner della vostra interfaccia utente pennino vostra classe, e in essa solo avere un UIView normale con tutte le tue cose. (L'unico punto di vista nel pennino del widget non può essere la classe stessa, o si ottiene ricorsiva in initWithCoder). Poi nel pennino che si desidera utilizzare, fare una vaniglia UIView e cambiare la sua classe. Non sarà in grado di vedere in realtà il widget all'interno di quella piazza, ma affare.

Auto è ora una visione in bianco e tMyActualSelf è l'unico punto di vista che avete fatto il lavoro nel nell'altra pennino. Sìì!

- (id)initWithCoder:(NSCoder*)coder 
{
    if ((self = [super initWithCoder:coder])) 
    {
        UIView *tMyActualSelf = nil;
        // Initialization code
        NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil];
        for (id object in tNibItems) 
        {
            if ([object isKindOfClass:[UIView class]])
                tMyActualSelf = (UIView *)[object retain];
        }   
        if( tMyActualSelf ) 
        {
            tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
            [self addSubview:tMyActualSelf];
        }
    }
    return self;
}
È stato utile?

Soluzione

Sento il tuo dolore quando si tratta di UIViewController essere l'unica cosa che è possibile specificare un carico di punta con, ma credo che sia perché ci deve essere proprietario di un file che è un controller, o qualcosa di simile, anche se sono non so perché un UIView non può essere un file proprietario.

penso che si può mettere le cose nella libreria sotto oggetti personalizzati, ma penso che si sarebbe limitato a mettere un UIView in là con la classe appena impostato su una sottoclasse personalizzata di UIView. Io in realtà guardato in cerca di estendere il costruttore di interfaccia e sembra che si può fare per OS X roba, ma non per iPhone roba. Coinvolge la compilazione di codice per il nuovo widget in Interface Builder per dirgli come disegnare il widget solo all'interno IB. Penso che ci sia in realtà un modello di OS X per questo.

Credo che quello che probabilmente farei è creare una vista principale in un file nib che contiene tutte le subviews, poi in initWithCoder: nella cosa UIAwesomeSauce aprire il file pennino, caricare la vista principale, ed è sufficiente posizionare all'interno auto in modo da avere una visione "non necessaria" tra la vista UIAwesomeSauce e le subviews (o sub subviews come il caso sarebbe.) io non sono sicuro di come inefficiente che è, ma in pasticciano con alcune cose sembra che alcuni punti di vista, come UIWebView sembrano avere uno di questi punti di vista apparentemente intermedie unnecssary (IIRC).

Se si arriva con una soluzione migliore per favore dimmi perché mi piacerebbe sapere troppo.

Modifica

Ora che lo guardo, penso che l'UIView PUÒ essere proprietario del file, semplicemente non è possibile configurarlo in IB. In pratica si potrebbe definire il carico pennino in qualcosa di simile nel UIView sottoclasse:

[fascio loadNibNamed: @ "UISpecialSauce" proprietario: opzioni self: ...]

Credo che se si crea punti vendita in UISpecialSauce o qualsiasi altra cosa allora essi dovrebbero essere assegnati correttamente a causa del proprietario:. Auto

Altri suggerimenti

C'è un cocoapod che potrebbe effettivamente aiutare con quanto segue: https://github.com/mobilejazz/NibWrapper

Si fornisce una vista wrapper che carica la bambino da un'altra NIB. È possibile specificare il nome di quel NIB all'interno attributo Interface Builder tramite un tempo di esecuzione.

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