2015-02-05 22 views
12

ich wissen will, für den Zugriff auf wie ein @IBOutlet in einer Klasse von einer anderen Klasse deklariert zuzugreifenWie ein IBOutlet von einer anderen Klasse

zum Beispiel habe ich eine Klasse mit dem Namen myfirstview

class MyFirstView: UIViewController { 

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

Ich möchte den Text der lblred von einer anderen Klasse MySecondView Namen zu ändern, die in einer anderen .swift Datei geschrieben wird:

class MySecondView: UIViewController { 

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

Aber nichts Happe ns.
Ich habe lblred mit einem Storyboard-Label verbunden. Ich habe viel darüber im Internet gesucht, aber ich kann nicht die finden, die mein Problem lösen kann. Bitte helfen Sie mir, dieses Problem zu lösen.

Vielen Dank.

+0

formatieren Sie bitte den Code –

Antwort

4

Problem ist hier:

var lblred : UILabel! = UILabel() 

Sie hier ein neues Label zu erstellen. Das bricht deine IBOutlet Verbindung. Sie brauchen nur

@IBOutlet var lblred : UILabel! 
+0

@cjwirth, Dank –

+1

Wenn ich das tue, ist das Ergebnis dieser zeigen: fataler Fehler: unerwartet gefunden null, während ein optionaler Wert Abwickeln –

+0

Es zeigt den Fehler, dass IBOutlet keine optionale Typ UILabel hat. Aber danke, dass Sie mir geholfen haben –

0

Es ist nicht die empfohlene Methode, ein IBOutlet von einer anderen Klasse aufzurufen. Wenn Sie ein IBOutlet aufrufen oder darauf zugreifen möchten, sollten Sie es als Eigenschaft festlegen und dann darauf zugreifen.

Zum Beispiel:

//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 ist richtig über Ihr unmittelbares Problem, aber das Problem ist tiefer. Kein Objekt sollte auf die IBOutlets eines anderen Objekts zugreifen. Es ist nicht klar definiert, was passieren wird. Dies war eine lange Quelle von Fehlern im ObjC-Code, und Swift eskaliert diese häufigen Fehler zu Abstürzen.

IBOutlets werden erst zugewiesen, wenn die Ansicht geladen ist. Das heißt, wenn der Ansichtscontroller zugewiesen ist, aber noch nicht auf dem Bildschirm angezeigt wurde, sind die IBOutlets immer noch gleich Null. Der Zugriff auf ein implizit ausgewickeltes Nil wird Swift zum Absturz bringen.

View-Controller sollten nur mit ihren untergeordneten View-Controllern kommunizieren. Sie sollten nicht mit beliebigen View-Controllern im System kommunizieren. Die Kommunikation zwischen beliebigen View-Controllern erfolgt über das Modell. Ein Ansichtscontroller aktualisiert das Modell und ein anderer Ansichtscontroller liest das Modell aus. Dies ist das Model-View-Controller Muster, auf dem der größte Teil von Cocoa aufgebaut ist.

View-Controller interagieren möglicherweise direkter mit ihren Kindern, sollten aber IBOutlets nicht direkt ändern. Sie sollten Eigenschaften festlegen. Es liegt in der Verantwortung des Child-View-Controllers, diese Daten zur richtigen Zeit von der Eigenschaft zum Label zu verschieben (was möglicherweise bis zu viewDidLoad() warten muss). Deshalb wird es "View-Controller" genannt. Es ist das eine Objekt, das für seine Ansichten verantwortlich ist. Niemand sonst sollte sich mit ihnen anlegen.

+0

, Sie haben Recht. Vielen Dank. –

Verwandte Themen