2017-04-13 42 views
-1

我有一個自定義的類分段控件,每次選擇分段控件中的不同項目時,都與視圖控制器進行通信。我能夠很好地將數據傳遞給視圖控制器。但是,當我每次更新傳遞的變量時嘗試使用某些基本邏輯時,「animateViews」函數內的所有項顯然變爲零。我收到臭名昭着的「意外發現無」錯誤。這隻發生在我嘗試使用我傳遞的變量時,一切按預期運行,否則在函數外部運行。調用函數時,函數中的項目變爲零 - Swift 3

import UIKit 

class MessagesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 

@IBOutlet weak var messageTableView: UITableView! 
@IBOutlet weak var boostCollectionView: UICollectionView! 

     override func viewDidLoad() { 
       super.viewDidLoad() 
      ...all cells, delegates, and datasource are registered and setup in here. 
     } 

     func animateViews(selectedIndex: Int) { 

       if selectedIndex == 0 { 
        print("LEFT") // prints as expected 
        self.messagesTableView.isHidden = false // unexpected found nil error on each of these items. 
        self.boostCollectionView.isHidden = true 
       } else if selectedIndex == 1 { 
        print("RIGHT") // prints correctly when updated 
        self.messageTableView.isHidden = true 
        self.boostCollectionView.isHidden = false 
       } 
      } 
} 

我一直在玩這個左右的時間太長了,我怎麼看法在animateViews功能隱藏和取消隱藏使用我從分段控制傳遞變量?

有可能是一個令人驚訝的簡單的修復,我沒有到這裏,但我很感激你讓你的眼球到目前爲止。謝謝!

+0

爲什麼有人會降低這個問題的投票率? –

回答

0

發生這種情況的原因是,當您撥打 messagesViewController.animateViews(selectedIndex: selectedIndex)時,MessagesViewController未實例化。這也意味着表視圖和集合視圖尚未繪製,並且您正在創建之前嘗試使用它。

viewDidLoad()方法必須被調用一次才能使用View Controller的UI元素。

每次調用該行let messagesViewController: MessagesViewController = storyboard.instantiateViewControl時,都會創建一個新的視圖控制器實例。

建議:

我的建議是創建分段控制的出口(好像你有在視圖控制器的多個分段控制),並創建一個像@IBAction func indexChanged(_ sender: AnyObject) {的方法,並指定此動作, value changed分段控件的屬性。

您可以使用sender參數區分分段控件。

+1

成功!你的解釋和建議太棒了!現在一切都很完美。感謝您的寶貴意見! –

相關問題