2015-02-05 11 views
12

Voglio sapere come accedere a un @IBOutlet dichiarato in una classe da un'altra classeCome accedere ad un IBOutlet da un'altra classe

per esempio, ho una classe denominata myfirstview

class MyFirstView: UIViewController { 

    @IBOutlet var lblred: UILabel! = UILabel() 
} 

voglio per modificare il testo della lblred da un'altra classe denominata MySecondView che è scritto in un altro file .swift:

class MySecondView: UIViewController { 

    func modify() { 
     let mfv = MyFirstView() 
     mfv.lblred.text = "Hello" 
    } 
} 

Ma niente Happe ns.
Ho collegato lblred con un'etichetta storyboard. Ho cercato molto su questo sul web ma non riesco a trovare quello che può risolvere il mio problema. Per favore aiutami a risolvere questo problema.

Grazie.

+0

formattare il codice –

risposta

4

Il problema è qui:

var lblred : UILabel! = UILabel() 

È la creazione di una nuova etichetta qui. Che rompe la tua connessione IBOutlet. Hai solo bisogno

@IBOutlet var lblred : UILabel! 
+0

@cjwirth, grazie –

+1

Quando lo faccio, il risultato mostrare questo: errore fatale: inaspettatamente trovato nulla, mentre scartare un valore opzionale –

+0

Essa mostra l'errore che non ha IBOutlet tipo UILabel opzionale. Tuttavia, grazie per avermi aiutato –

0

non è il modo consigliato di chiamare un IBOutlet da un'altra classe. Se si desidera chiamare o accedere a un IBOutlet, è necessario impostarlo come proprietà e quindi accedervi.

Ad esempio:

//ViewControler.h 

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UILabel *label; 

@end 

//abc.m 

#import <UIKit/UIKit.h> 
#import <ViewController.h> 

@interface abc 

@end 

@implementation abc 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
ViewController *viewCOntroller= [ViewController alloc] init]; 
viewCOntroller.label.text = @"Hello"; 
} 
13

@Sheen è corretta circa il tuo problema immediato, ma il problema è più profondo. Nessun oggetto deve accedere agli IBOutlet di un altro oggetto. Non è ben definito cosa accadrà. Questa è stata una lunga fonte di bug nel codice ObjC e Swift intensifica questi bug comuni in caso di arresto anomalo.

IBOutlet non vengono assegnati fino a quando la vista non viene caricata. Ciò significa che se il controller della vista è allocato ma non è ancora stato messo sullo schermo, gli IBOutlet sono ancora nulli. Accedere a un nil involontariamente involontario si bloccherà Swift.

I controller di vista devono comunicare solo con i rispettivi controller di visualizzazione figli. Non dovrebbero comunicare con controller di vista arbitrari nel sistema. La comunicazione tra i controller di vista arbitrari avviene tramite il modello. Un controller di vista aggiorna il modello e un altro controller di vista legge dal modello. Questo è lo schema Model-View-Controller che la maggior parte di Cocoa è costruito intorno.

I controller di vista possono interagire più direttamente con i loro figli, ma non devono comunque modificare direttamente IBOutlets. Dovrebbero impostare le proprietà. È responsabilità del controllore della visualizzazione dei bambini trasferire tali dati dalla proprietà all'etichetta all'ora corretta (che potrebbe dover attendere fino al viewDidLoad()). Ecco perché è chiamato "controller di visualizzazione". È l'unico oggetto responsabile delle sue opinioni. Nessun altro dovrebbe pasticciare con loro.

+0

, sei corretto. Grazie. –