2015-02-05 61 views
12

我想知道如何從另一個類訪問聲明的@IBOutlet在類訪問一個IBOutlet如何從另一個類

例如,我有一個類名爲myfirstview

class MyFirstView: UIViewController { 

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

我想

class MySecondView: UIViewController { 

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

但沒有什麼Happe的:到lblred的文本從名爲MySecondView另一類是寫在另一個.swift文件更改納秒。
我已將lblred連接到故事板標籤。我在網上搜索了很多關於這方面的信息,但是我找不到能解決我的問題的方法。請幫我解決這個問題。

謝謝。

+0

請格式化代碼 – 2015-02-05 12:58:59

回答

4

問題是在這裏:

var lblred : UILabel! = UILabel() 

您可以創建一個新的標籤。這打破了你的IBOutlet連接。您只需要

@IBOutlet var lblred : UILabel! 
+0

@cjwirth,感謝 – 2015-02-05 12:54:33

+1

當我這樣做,結果顯示此:致命錯誤:意外發現零而展開的可選值 – 2015-02-05 13:00:01

+0

這表明IBOutlet中沒有可選類型的UILabel錯誤。不過,謝謝你的幫助 – 2015-02-05 13:08:42

0

它不是從另一個類中調用IBOutlet的推薦方法。如果你想打電話或訪問一個IBOutlet,那麼你應該將其設置爲屬性,然後訪問它。

例如:

//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是關於你眼前的問題是正確的,但你的問題是更深。沒有對象應該訪問另一個對象的IBOutlets。它沒有很好的定義會發生什麼。這是ObjC代碼中長期存在的錯誤來源,Swift會將這些常見錯誤升級爲崩潰。

直到加載視圖才分配IBOutlets。這意味着如果視圖控制器已分配但尚未放在屏幕上,那麼IBOutlet仍然爲零。訪問一個隱式解開的nil會使Swift崩潰。

視圖控制器應該只與子視圖控制器通信。他們不應該與系統中的任意視圖控制器進行通信。任意視圖控制器之間的通信通過模型完成。一個視圖控制器更新模型,另一個視圖控制器讀取模型。這是Cocoa大部分建立的Model-View-Controller模式。

視圖控制器可能會更直接地與其子項交互,但仍不應直接修改IBOutlet。他們應該設置屬性。子視圖控制器有責任在正確的時間將該數據從屬性移動到標籤(可能必須等到viewDidLoad())。這就是爲什麼它被稱爲「視圖控制器」。它是負責其觀點的一個對象。沒有人應該惹他們。

+0

,你說的沒錯。謝謝。 – 2015-02-05 13:43:43