在instantiateViewControllerWithIdentifier之后的IBOutlet nil

不确定我在这里做错了什么。 我列出了我的问题和我的代码。 很想得到一些帮助。

谢谢!

问题:

  • VC1呈现VC2。
  • VC1的IBOutlets现在是零。
  • VC2解散回VC1。
  • VC1中的IBOutlets仍然是零。

VC1从flickR加载一个网格图片。 VC2有一个searchBar控制器,当VC2被解散时,它运行flickR查询。 在我的self.collectionView.reload()失败之前,因为self.collectionView是零:(

VC1

import UIKit class MainViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { @IBOutlet var collectionView: UICollectionView! @IBOutlet var searchMask: UIView! let api_key = "f87357398a52b80e0c9f76bf94c8ee94" var flickResults:NSMutableArray! = NSMutableArray() var titleResults:NSMutableArray! = NSMutableArray() override func viewDidLoad() { super.viewDidLoad() loadPhotos("Brasil") // Do any additional setup after loading the view. } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) } func loadPhotos(searchString: String) { let flickr:FlickrHelper = FlickrHelper() println("Collection: \(self.collectionView)") flickr.request(searchString, per_page: 50, completion: { (searchStr, flickrPhotos, photoTitle) -> () in dispatch_async(dispatch_get_main_queue(), { self.flickResults = flickrPhotos self.titleResults = photoTitle self.collectionView.reloadData() }) }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell: PhotoCell = self.collectionView.dequeueReusableCellWithReuseIdentifier("photoCell", forIndexPath: indexPath) as PhotoCell cell.photoImageView.alpha = 0 let queue:dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_async(queue, { let searchURL: String = self.flickResults.objectAtIndex(indexPath.item) as String let title: String = self.titleResults.objectAtIndex(indexPath.item) as String let image: UIImage = self.loadImage(searchURL) dispatch_async(dispatch_get_main_queue(), { UIView.animateWithDuration(0.5, animations: { cell.photoImageView.image = image cell.photoTitle.text = title.capitalizedString cell.photoImageView.alpha = 1 }) }) }) insertBlurView(cell.titleMask, UIBlurEffectStyle.Dark) return cell } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.flickResults.count } func loadImage(imageUrl: String) -> UIImage{ let url = NSURL(string: imageUrl) let data = NSData(contentsOfURL: url!) let image = UIImage(data: data!) return image! } @IBAction func searchButtonPressed(sender: UIButton) { let storyboard = UIStoryboard(name: "Main", bundle: nil); let vc: SearchViewController = storyboard.instantiateViewControllerWithIdentifier("Search") as SearchViewController providesPresentationContextTransitionStyle = true definesPresentationContext = true vc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext self.presentViewController(vc, animated: false, completion: nil) } } 

VC2

  import UIKit class SearchViewController: UIViewController, UITextFieldDelegate, UISearchBarDelegate, UICollectionViewDelegate { @IBOutlet var searchMask: UIView! @IBOutlet var searchField: UITextField! @IBOutlet var searchBar: UISearchBar! override func viewDidLoad() { super.viewDidLoad() insertBlurView(self.searchMask, UIBlurEffectStyle.Dark) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func exitTap(sender: UIButton) { self.dismissViewControllerAnimated(true, completion: nil) } func searchBarSearchButtonClicked(searchBar: UISearchBar) { self.dismissViewControllerAnimated(true, completion: { let mainvc = self.storyboard?.instantiateViewControllerWithIdentifier("Main") as MainViewController mainvc.loadPhotos(searchBar.text) }) } } 

感谢rdelmar,我能够使用协议来解决这个问题。

这是我补充说的:

  • SearchDelegate
  • SearchDelegate函数runSearch()

VC1

 class MainViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, SearchDelegate { func runSearch(searchString: String) { loadPhotos(searchString) } } 

VC2

 protocol SearchDelegate { func runSearch(searchString: String) } class SearchViewController: UIViewController, UITextFieldDelegate, UISearchBarDelegate, UICollectionViewDelegate { @IBOutlet var searchMask: UIView! @IBOutlet var searchField: UITextField! @IBOutlet var searchBar: UISearchBar! var delegate: SearchDelegate? func searchBarSearchButtonClicked(searchBar: UISearchBar) { delegate?.runSearch(searchBar.text) self.dismissViewControllerAnimated(true, completion:nil) }