在 Swift 3 中使用 prepareForSegue 分配对象变为 nil

Posted

技术标签:

【中文标题】在 Swift 3 中使用 prepareForSegue 分配对象变为 nil【英文标题】:assing object with prepareForSegue becomes nil in Swift 3 【发布时间】:2017-09-22 02:00:26 【问题描述】:

先生,

我正在尝试实现一个表单并传递下面的数据对象

import UIKit
import GRDB

class Staff: Record 
    var id: Int64?
    var compId: Int64 = 0 
     var chiName: String  = ""
    var engName: String  = ""

到表视图控制器加载子记录。在实施方面,它似乎变得空虚并且没有意义。您能告诉我在这种情况下如何确保第二个视图控制器不接收空对象吗?

下面是 日志:

这是我的代码:

第一个 UIView 控制器

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    print("view salary X ")
    print(dummy)
    print(dummy.id ?? "0")

    if let secondController = segue.destination as? ViewSalaryTableViewController 
        secondController.dummyStaff = dummy
    
 

第二个 UITableView 控制器:

  public var dummyStaff : Staff?

override func viewDidLoad() 
    super.viewDidLoad()
..
    print("arrive dummyStaff")
    print(dummyStaff ?? "njull")

故事板部分草稿:

故事板设置

【问题讨论】:

【参考方案1】:

确保 secondController 的类型转换工作正常。如果有多个 segue,则使用 segue 标识符进行区分。下面的代码对我来说很好用:

class MyBook 
    var name:String!

视图控制器 1

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "Vc1ToVc2" 
            let book = MyBook()
            book.name = "Harry"
            if let destinationVc = segue.destination as? ViewController2 
                destinationVc.book = book
            
        
    

视图控制器 2

var book:MyBook?

    override func viewDidLoad() 
        super.viewDidLoad()
        print(book?.name ?? "No name")
    

版画:哈利

【讨论】:

以上是关于在 Swift 3 中使用 prepareForSegue 分配对象变为 nil的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 4.1 编译的模块无法在 Swift 3.2.3 中导入

无法在 Swift 3 中使用闭包语法

如何在 swift 3.0 中编写此代码,特别是如何在 swift3 中使用宏?

使用 Swift 3.0.1 编译的模块无法在 BuddyBuild 上的 Swift 3.0 中导入

如何在 Swift 3 中使用 BFTask?

如何在 Swift 3 中使用 NSLocale 获取国家代码