ios - Swift 3,成功传递数据但var在使用时返回nil

标签 ios swift

下面是我从 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/

相关文章:

ios - 选择第二个单元格时首先调用 Swift UITableViewController didSelectRow

objective-c - 以编程方式创建的 UILabel 不会在旋转时调整大小

Swift-SceneKit-无法从 '.scn' 加载 'art.scnassets' 文件

iOS - swift - 使用 AVFoundation 合并视频

swift - 如何启用/禁用 TextField SWIFT

ios - for 循环中的 attributedString 和 textView 颜色变化

ios - 将项目从 ObjC 移植到 Swift 后应用程序无法启动

ios - XCode 模拟器未显示最新更改

swift - 如何在 iOS 13 中串流远程音频? ( swift 用户界面)

ios - NSView setNeedsDisplay 不可用