Ios 使用segues将数据传递给另一个vc的方法,无需打开var

Ios 使用segues将数据传递给另一个vc的方法,无需打开var,ios,swift,xcode,Ios,Swift,Xcode,在使用segues(或不使用segues)时,有没有避免开放变量的方法? 每个人都看到这样的代码: if segue.identifier == ListViewController.className() { guard let indexPath = tableView.indexPathForSelectedRow else { return } let destinationVC = segue.destination as? ListViewCo

在使用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
私有化
。如果存在不使用segues和将数据推至私有的好方法,我将很高兴知道

我试图使用
init()
navigationController?.pushViewController(ListViewController(数据:数据),动画:true)
但是
线程1:致命错误:在第行展开可选值时意外发现nil

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

你可以这样做

class ListViewController {

    private var passedData: CategoryModel?

    private init () {
    }

    public convenience init (passedData: CategoryModel?) {
        self.init()
        self.passedData = passedData
    }
}
并在初始表视图控制器的
表视图(uu:didSelectRowAt:)
中:

let data: CategoryModel = filteredData[indexPath.row]
let destinationVC = ListViewController(passedData: data)
self.present(destinationVC, animated: true, completion: nil)

实际上,您不能让Interface builder为视图控制器使用自定义初始化,它将始终使用
init?(编码器:)

因此,将数据传递到视图控制器的最简单方法是使用非私有属性


但是,如果你真的不想使用
内部
公共
变量,你可以尝试使用单例或通知,但我认为这不是明智的

我相信目标是将
传递数据
私有化,但仍然以某种方式使用segue。@rmaddy在使用时不可能将其私有化还是私有化segue?@Carpsen90我有一个错误,
tableView
outlet在
self.tableView.register(ListTableViewCell.nib(),forCellReuseIdentifier:ListTableViewCell.identifier())时为零。谁应该调用便利初始值设定项?如果您使类派生自
UIViewController
,它就不会编译。而且根本不使用
destinationVC
。@Carpsen90
让destinationVC=ListViewController(passedData:data)
未使用。也许我只是想把这个变量设为私有变量,但这会如何影响代码的可测试性呢?事实证明,任何方法都可以把任何东西放在那里。这让我担心。我不喜欢单音,但我发现任何对segues的偏离只会使代码复杂化。我不确定这里的可测试性是不是一个问题。如果您对可测试性和良好的体系结构感兴趣,您可能希望尝试Clean Swift或VIPER。是的,我会使用一个var并保持代码简单这些链接可能会有帮助,而这一个