无需打开var即可使用segues将数据传递到另一个vc的方法

时间:2018-09-29 16:31:23

标签: ios swift xcode

在使用segues(或不使用segues)时,是否有一种避免开放变量的方法? 每个人都看到这样的代码:

if segue.identifier == ListViewController.className()
    {
        guard let indexPath = tableView.indexPathForSelectedRow else { return }
        let destinationVC = segue.destination as? ListViewController

        var data: CategoryModel

        data = filteredData[indexPath.row]

        destinationVC?.passedData = data
    }
}

但是在ListViewController中,我们有一个可供访问的变量。

class ListViewController: UIViewController
{
    //MARK: - DataSource
    var passedData: CategoryModel?

也许可以避免这种情况?

我正在考虑使用init(data: data)进行依赖项注入,但是如何正确启动此vc?

已编辑。

使用segue并不是主要目标。主要是制作var private。如果存在不使用segues和将数据私有化的好方法,我将很高兴知道。

我正尝试使用init()navigationController?.pushViewController(ListViewController(data: data), animated: true)Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value行:

self.tableView.register(ListTableViewCell.nib(), forCellReuseIdentifier: ListTableViewCell.identifier())

2 个答案:

答案 0 :(得分:1)

您实际上无法使“界面”构建器为视图控制器使用自定义init,它将始终使用init?(coder:)
因此,将数据传递到视图控制器的最简单方法是使用非私有属性。

但是,如果您真的不想使用internalpublic var,则始终可以尝试使用Singleton或Notifications,但我认为这样做不明智

答案 1 :(得分:0)

您可以这样做

-e include("$(ENV["HOME"])/.julia/config/startup-babel.jl") -i

在初始表视图控制器的class ListViewController { private var passedData: CategoryModel? private init () { } public convenience init (passedData: CategoryModel?) { self.init() self.passedData = passedData } } 中:

tableView(_:didSelectRowAt:)