IBOutlet ноль после экземпляра ViewControllerWithIdentifier

Не уверен, что именно я делаю неправильно здесь. Я перечислил, в чем моя проблема и мой код. Хотелось бы получить помощь.

Спасибо!

Проблема:

  • VC1 представляет VC2.
  • IBOutlets из VC1 теперь равны нулю.
  • VC2 уходит обратно в VC1.
  • IBOutlets в VC1 по-прежнему равны нулю.

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)
    })
  }
}

person b26    schedule 25.02.2015    source источник
comment
Использование PerformSegueWithIdentifier() не вызовет никаких проблем. Не уверен, что instanceiateViewControllerWithIdentifier вызывает ошибку.   -  person b26    schedule 26.02.2015
comment
Откуда вы знаете, что выходы VC1 равны нулю после того, как вы представляете VC2 (так не должно быть)? Почему в методе searchBarSearchButtonClicked вы создаете новый экземпляр MainViewController? Вы не должны этого делать. Стандартный способ вызова метода в контроллере, к которому вы возвращаетесь, — это делегирование.   -  person rdelmar    schedule 26.02.2015
comment
Спасибо за ответ :) В функции VC2s viewDidLoad() я запускаю этот фрагмент кода println(MainViewController().controllerView), чтобы увидеть, существует ли он, но он всегда возвращает nil. Я попробую метод делегирования и обновлю этот пост.   -  person b26    schedule 26.02.2015
comment
Вы получаете ноль, потому что MainViewController() просто выделяет новый контроллер представления, а не тот, который был создан в раскадровке с подключенными выходами.   -  person rdelmar    schedule 26.02.2015
comment
смог разобраться, еще раз спасибо. Я разместил ответ ниже. Если вы видите какие-либо ошибки, пожалуйста, дайте мне знать. Ваше здоровье   -  person b26    schedule 26.02.2015


Ответы (1)


Благодаря 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)

}
person b26    schedule 26.02.2015