Domanda

Voglio cambiare un'immagine su una vista, da una finestra pop-up di 4-6 icone (immagino come cambiare la vostra immagine su un applicazione di messaggistica). Il mio modo di attuare questo popup modale è con la creazione di una nuova vista a IB, con l'opacità sullo sfondo, e poi ho caricare questo come una visualizzazione secondaria:

    IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];

Così, quando l'utente tocca un'icona, ho

- (IBAction)iconIsSelected:(id)sender {
switch ([sender tag]) {
    case 1:
        [(ParentViewController*)[self superview] changeIcon];
        break;
    case 2:
        // same here..
        break;
    default:
        break;
}
[self.view removeFromSuperview];
[self release];

}

Il changeIcon solo imposta la image a un'icona corrispondente. Come si può intuire, questo non sta funzionando - il messaggio changeIcon non funziona mai. Non riesco a capire che cosa sto facendo di sbagliato, tutto l'aiuto molto apprezzato!

È stato utile?

Soluzione

Avete alcune scelte qui ...

La prima è creare una proprietà sulla vostra IconsViewController di tipo ParentViewController*, ad esempio:

@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference

Per rompere questo ulteriormente verso il basso:

  • readwrite perché vogliamo essere in grado di accedere al valore tramite [self parentController] ma anche cambiarlo tramite [iconsViewController setParentController:self]
  • nonatomic perché io non sono troppo preoccupato per filettatura
  • assign per renderlo un "riferimento debole" in cui il genitore non sarà trattenuto dal bambino. Se ognuno di loro retain l'altro, potrebbe portare a perdite di memoria più tardi perché se non esplicitamente rilasciato che ci si finisce con un cerchio mantenere causando né oggetto di colpire uno zero mantenere conteggio.

Quando si carica dal pennino, impostare la proprietà:

IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;

Poi, chiamata ad esso dall'interno di iconIsSelected in questo modo:

[[self parentController] changeIcon];

In alternativa, è possibile creare un protocollo delegato:

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

E usare questo protocollo come una proprietà, invece che il tipo genitore View Controller. Questo è più astratto, ma mantiene il pulitore di progettazione. Il controller della vista genitore sarebbe quindi implementare questo protocollo delegato, come uno dei tanti altri.

Un'altra opzione è quella di utilizzare NSNotificationCenter e pubblicazione / sottoscrizione di eventi dalla vostra visione dinamica. Questo è l'accoppiamento "loosest" tra i due oggetti, ma potrebbe essere eccessivo per questo scenario.

Altri suggerimenti

Il superview di vista è una vista, non un controller della vista, ma si scagli la superview di essere di classe ParentViewController. Se la vista non ha superview, restituisce nil, e il messaggio a zero sono no-ops (il che spiega il motivo per cui non sbattere lì).

A proposito, che [self release] alla fine è molto sospetto.

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