下面是我从 VC1 编写的代码,并将数据传递给 VC2。
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
selectedArtist = artists[indexPath.item]
performSegue(withIdentifier: "artistToArtSegue", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "artistToArtSegue" {
let artCollectionController = ArtCollectionController()
artCollectionController.artist = selectedArtist
artCollectionController.selectedArtist = selectedArtist
}
}
VC2中的这些代码将打印数据
class ArtCollectionController: UICollectionViewController {
var artist = Artist() {
didSet{
print(artist.artistId ?? "did not work")
print(artist.name ?? "what name?")
}
}
var selectedArtist = Artist()
但是当我在 VC2 中使用以下测试代码中的变量时。他们返回零。
func fetchArtForArtist() {
guard let artistId = selectedArtist.artistId else {return}
print(artistId)
let fanRef = FIRDatabase.database().reference().child("art_ref").child(artistId)
fanRef.observeSingleEvent(of: .childAdded, with: { (snapshot) in
let artId = snapshot.key
print(artId)
// let dataRef = FIRDatabase.database().reference().child(artId)
// dataRef.observe(.value, with: { (snapshot) in
// let dictionary = snapshot.value as? [String: AnyObject]
// //let art =
// }, withCancel: nil)
}, withCancel: nil)
}
@IBAction func testButton(_ sender: UIBarButtonItem) {
print(selectedArtist.name ?? "no name")
print(12345)
}
override func viewDidAppear(_ animated: Bool) {
selectedArtist = artist
print(artist.name ?? "non")
print(selectedArtist.artistId ?? "no id")
}
override func viewDidLoad() {
super.viewDidLoad()
fetchArtForArtist()
selectedArtist = artist
print(artist.name ?? "non")
print(selectedArtist.artistId ?? "no id")
}
我在 Storyboard中这样做。我什至使用 2 个变量来查看是否存在差异。我不明白为什么数据成功传递给 VC2 到几个变量,但是当使用变量时它返回 nil。请帮忙。
最佳答案
其他的回答都不错,但我更喜欢稍微不同的方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.destination {
case let artCollectionController as ArtCollectionController:
artCollectionController.artist = selectedArtist
artCollectionController.selectedArtist = selectedArtist
case let otherViewController as OtherViewController:
//Code for some other case
}
}
通过使用 switch 语句,您有一个 prepareForSegue
可以干净地处理多个不同的 segue。
case let
构造是一个很酷的技巧,它只在 switch 中的变量可以是所需类型的 case 时才执行该 case。如果它可以被转换,它会创建一个所需类型的局部变量。
我更喜欢根据目标 View Controller 的类来决定执行什么代码,因为它比使用 segue 标识符更不脆弱。如果您忘记设置 segue 标识符,或者稍后将第二个 segue 添加到相同类型的 View Controller ,或者标识符名称中有拼写错误,则该代码将不起作用。但是,如果您的类名中有拼写错误,编译器会抛出错误。
关于ios - Swift 3,成功传递数据但var在使用时返回nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42889460/