2017-01-18 21 views
2

Salutations,什麼是使用getter/setters的正確方法

這是我以前的文章(Incorrect data passed on first click of button)的後續。它被回答了,但是更新過的編輯發生了。

我的查詢如下,目前我有兩個IBActions funcs,它們是空的,缺少任何類型的代碼,它們存在的唯一目的是它們連接到我的其他視圖控制器,因此如果我刪除他們我沒有辦法區分應該使用哪個segue(我的理解是,雖然我們可以在兩個視圖控制器之間創建segges,但我認爲只有一個纔有意義(例如,如何決定哪個應該去哪。用),我離題

我試圖用我的代碼如下之前:

self.performSegue(withIdentifier: "slideTwo", sender: self); 

這但是,它確實會導致雙重繼續。因此,我決定爲以下幾點:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     let passedPic = segue.destination as! ViewControllerTwo; 

     if(segue.identifier == "slideOne") { 
      passedPic.picsChosen = sLS1; 
     } else { 
      passedPic.picsChosen = sLS2; 
     } 
    } 

這個效果很好,做什麼,我需要的,但後來我有兩個空IBActions的問題:

@IBAction func slideShowOne() { 

    } 

    @IBAction func slideShowTwo() { 

     //self.performSegue(withIdentifier: "slideTwo", sender: self); 

    } 

這是我想也許我可以嘗試創建一個getter/setter(這使得swift比真正的應該更復雜)。這是我迷失的地方。

的代碼如下:

var picsChosen : [String] { 
    set(newData) { 
     for index in 0..<newData.count { 
      print("Index is: ", newData[index]); 
     } 
     self._picsChosen = newData; 
    } get { 
     return self._picsChosen; 
    } 
} 

現在,我的問題是雙重的。首先,實際訪問並將值傳遞給我的變量的正確方法是什麼?我試着這樣做:myClass: ViewControllerTwo! = ViewControllerTwo();

然後用myClass.picsChosen = myArray;然而,儘管它確實出現了數據被成功地傳遞到我的VC2,因爲顯示我遍歷(二傳手內)我看到成功的價值觀的時候,當我嘗試訪問picsChosen以外,我得到一個索引越界錯誤,換句話說,該值從未與picsChosen相關聯。目前我擁有它的方式運作良好,但我想知道使用getters/setter的正確方法是什麼,以及爲什麼我沒有工作。

乾杯!

+0

它很難理解你在做什麼,什麼是你的實際需求,你的問題看起來像更多的是比getter/setter,而你完全不需要getter/setter這樣的東西,因爲你不計算任何東西時得到的數據 – Tj3n

回答

3

這個效果很好,做什麼,我需要的,但後來我有 兩個空IBActions問題:你不需要這些空@IBAction小號

。他們沒有爲你做任何事情。故事板中的按鈕通過有線連接,因此您不需要@IBAction。如果您刪除了代碼,則還需要從故事板中刪除連接,否則當您嘗試調用已刪除的@IBAction時,您的應用將崩潰。刪除,控制 - 單擊故事板中的按鈕,然後單擊旁邊的小x TouchUp Inside刪除連接。然後你可以在你的代碼中刪除@IBAction

如果我刪除他們,我也沒有辦法來區分它們之間Segue公司 應使用

事實並非如此。你有兩個不同的按鈕連接兩個不同的賽段。賽格的標識符是你如何區分兩個賽段。

我試着這樣做:myClass: ViewControllerTwo! = ViewControllerTwo();

當使用塞格斯,該SEGUE爲您創建目標的viewController。 這不起作用,因爲您在此創建全新的ViewControllerTwo。您將值傳遞給此新實例,這不是故事板segue爲您創建的ViewControllerTwo

當使用segues時,您應該傳遞prepare(for:sender:)中的數據,就像上面顯示的一樣。獲取目標ViewController並填寫要傳遞的數據。

而現在的問題,你沒有問:

我怎麼能使用@IBAction s到觸發 SEGUE已經做到了這一點?

  1. 刪除從您的按鈕有線的塞格斯。

  2. 將segue從viewController1連線到viewController2。單擊故事板中的segue箭頭並指定標識符slideShow

  3. 爲您的兩個按鈕分配唯一標籤。您可以在Interface Builder中進行設置。給第一個按鈕標籤1,第二個按鈕標籤2

  4. 你的按鈕可以共享相同的@IBAction

    @IBAction func goToSlideShow(button: UIButton) { 
        self.performSegue(withIdentifier: "slideShow", sender: button) 
    } 
    
  5. prepare(for:sender:)

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
        let passedPic = segue.destination as! ViewControllerTwo 
    
        if let button = sender as? UIButton { 
         if button.tag == 1 { 
          passedPic.picsChosen = sLS1 
         } else if button.tag == 2 { 
          passedPic.picsChosen = sLS2 
         } 
        } 
    } 
    
+0

謝謝你的回覆,明天早上我會給你一個鏡頭。現在,上一次我有一個self.performsegue與一個準備它做了一個雙重賽。這裏會發生嗎?另外,我想我應該從按鈕中刪除我的兩個賽段,而只是從一個VC到另一個VC,是正確的? – SomeStudent

+0

由於您從按鈕上連接了Segue,因此您正在獲得雙重繼續。如果你想用'performSegue'調用它們,你需要將它們從VC1頂部的viewController圖標連接到VC2。你現在這樣做沒什麼問題。只是擺脫那些空的@IBActions。 – vacawama

+0

是的,如果你要使用'performSegue',刪除兩個塞格斯你從按鈕的到來。 – vacawama

相關問題