2016-11-28 20 views
1

對於令人困惑的標題感到抱歉,我不知道如何使它更有意義。UIView在prepareForSegue方法中無效

我正在執行使用這個例子中的信息窗口:github

我加入了幾個標籤到popView,並將它們連接到secondaryVieController。

我已經修改prepareForSegue方法PrimaryViewController到:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "showInfo" { 

      let info = segue.destinationViewController as! SecondaryViewController 
      info.adrLabel.text = branch.address 
      info.nameLabel.text = branch.name 
      info.telLabel.text = branch.tel 

      dim(.In, alpha: dimLevel, speed: dimSpeed) 
    } 
} 

但是當我運行它,我得到錯誤「致命錯誤:意外發現零而展開的可選值」

這是因爲信息。 popupView是零。

但你能解釋我該怎麼設置它嗎?如果沒有任何額外的標籤,爲什麼它工作正常。

謝謝。

回答

2

,您將可以訪問這個

info.adrLabel.text = branch.address 
info.nameLabel.text = branch.name 
info.telLabel.text = branch.tel 

值將是SecondaryViewControllerviewDidLoad()第一種方法。

您需要在這些變量中創建變量並賦值,並在viewDidLoad()中使用這些變量將值賦給標籤。

+0

是的,當然它工作!將能夠在兩分鐘內接受。但爲什麼它發生? uiview尚未加載,這就是爲什麼我不能在視圖內分配標籤的原因?或查看?再次感謝 – Almazini

+0

您的視圖未在'prepareForSegue'方法中初始化,每個UIViewController視圖都將在viewDidLoad中初始化,並且每當您將變量上的可選綁定變量設置爲零時,您的應用就會崩潰。 – Rajat

1

你得到零,因爲你正試圖設置值之前,視圖已經從你的prepareForSegue方法加載。取而代之的是,建立在你的SecondaryViewController持有的價值觀和設定標籤在viewDidLoad中一些變量:

class SecondaryViewController { 
     var address: String? 
     var name: String? 
     var tel: String? 

     override func viewDidLoad() { 
     adrLabel.text = address 
     nameLabel.text = name 
     telLabel.text = tel 
     } 
    } 

現在,所有你需要在你的prepareForSegue做的是:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "showInfo" { 

     let info = segue.destinationViewController as! SecondaryViewController 
     info.address = branch.address 
     info.name = branch.name 
     info.tel = branch.tel 

     dim(.In, alpha: dimLevel, speed: dimSpeed) 
    } 
    } 
+0

謝謝!我投了你的答案,但我們的同事的回答是第一個:) – Almazini

+0

很高興我可以幫助 – gwinyai

1

一般來說你不應該嘗試直接操縱另一個視圖控制器的視圖。這違反了封裝原則。你應該認爲他們是私人的。

相反,將屬性添加到您的目標視圖控制器並設置這些屬性。然後在您的目標視圖控制器的viewWillAppear方法中,將這些屬性的值安裝到適當的視圖中。

這樣,如果您以後更改您的視圖控制器的看法,你只需要改變一個地方(視圖控制器)

代碼(此外,像你prepareForSegue功能的情況下,這是行不通的。)

+0

謝謝鄧肯爲這樣一個偉大的解釋!我投了你的答案 – Almazini