2017-04-13 53 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

成功!你的解释和建议太棒了!现在一切都很完美。感谢您的宝贵意见! –