gpt4 book ai didi

ios - 实例化ViewControllerWithIdentifier后IBOutlet为零

转载 作者:行者123 更新时间:2023-11-29 02:16:06 26 4
gpt4 key购买 nike

不确定我到底做错了什么。我已经列出了我的问题是什么和我的代码。很想得到一些帮助。

谢谢!

问题:

  • VC1 介绍 VC2。
  • 来自 VC1 的 IBOutlets 现在为零。
  • VC2 解散回到 VC1。
  • VC1 中的 IBOutlets 仍然是 nil。

VC1 从 flickR 加载图片网格。 VC2 有一个 searchBar Controller ,当 VC2 被关闭时它会运行 flickR 查询。就在我的 self.collectionView.reload() 失败之前,因为 self.collectionView 是 nil :(

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,我能够使用协议(protocol)解决这个问题。

这是我添加的内容:

  • 搜索委托(delegate)
  • 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)

}

关于ios - 实例化ViewControllerWithIdentifier后IBOutlet为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28732084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com