Ios 为什么presentViewController再次调用viewDidLoad?

Ios 为什么presentViewController再次调用viewDidLoad?,ios,swift,storyboard,segue,Ios,Swift,Storyboard,Segue,我有一个ViewController,使用storybard构建,它包含一个UITableView。当按下UITableViewCell时,我只想显示一些ViewController。在didSelectRowAt方法中,我执行以下操作: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { present(SomeViewController(), animated: true)

我有一个ViewController,使用storybard构建,它包含一个UITableView。当按下UITableViewCell时,我只想显示一些ViewController。在didSelectRowAt方法中,我执行以下操作:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    present(SomeViewController(), animated: true)
}
但我使用调试器进行了检查,这在ViewController中调用viewDidLoad。以下是我在ViewController中的viewDidLoad:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    myTableView.dataSource = self
    myTableView.delegate = self
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "Hello"
    return cell 
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    present(SomeViewController(), animated: true)
}
}
Xcode抛出一个错误,myTableView在这里为零。这是什么原因呢?似乎我不知道iOS开发中的一些众所周知的概念。似乎不可能在没有segues的情况下从ViewController显示SomeViewController,因为ViewController完全是使用情节提要构建的,而SomeViewController没有任何情节提要。因此,似乎不可能合并。另一个想法是它只是一个Xcode bug。那么,错误的原因是什么

更新: 这是我的ViewController:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    myTableView.dataSource = self
    myTableView.delegate = self
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "Hello"
    return cell 
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    present(SomeViewController(), animated: true)
}
}
tableView出口为nil,因为您正在使用类似于SomeViewController的init创建SomeViewController的实例。这将无法连接控制器中的插座

而是使用故事板创建SomeViewController的实例,即


不要忘记将SomeViewController的storyboard ID设置为storyboard中的SomeVC。

原因是我意外地从ViewController继承了SomeViewController。不是UIViewController。只需查看控制器。这当然迫使我们调用viewDidLoad。永远不会使用默认的ViewController名称

但是SomeViewController不在故事板中。如果不在,则创建tableView的@IBOutlet没有任何意义。谢谢,但您不理解这个问题@tableView的IBOutlet位于ViewController中,而不是SomeViewController中。SomeViewController没有任何插座。里面所有的东西都是按程序制作的。我只是想展示一下。这就是全部。但当我调用present方法时,它在ViewController中调用viewDidLoad,其中tableView出口已经变为零。我知道这很奇怪。可能是Xcode错误,或者我不知道iOS中有什么严重的问题。在这种情况下,在调用didSelectRowAt之前,您是否对ViewController的实例进行了任何更改?我在一个问题中添加了我的ViewController。这真的很简单。我只是想了解为什么会出现这个问题。所以我做了一些虚拟的ViewController只是为了显示问题。你确定是这样的吗?在ViewController中的viewDidLoad func中添加printin viewDidLoad。我打赌您只会在初始加载时看到调试控制台输出,而不会在调用present时看到。您是否可能在SomeViewController中引用了myTableView?我肯定。我添加并准备将控制台输出显示为图像。没有参考资料。我告诉你更多。如果我添加“If”语句来检查myTableView是否为nil或NotViewDidLoad,则会成功显示SomeViewController。原因是viewDidLoad以某种方式被调用,myTableView被终止,但“if”语句只是从错误中保存。这太荒谬了。我建议用一个新项目来尝试。我使用的是您发布的代码,当我展示SomeViewController时,viewDidLoad肯定没有被调用。它肯定不是Xcode错误。正如我所说的,我做了一个快速测试,效果很好。。。没有对viewDidLoad的额外调用,也没有由于myTableView为零而导致的错误。只是为了确定,我假设SomeViewController不是ViewController的子类?如果展示SomeViewController类,事情会变得更简单
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let controller = self.storyboard?.instantiateViewController(withIdentifier: "SomeVC") as? SomeViewController {
        self.present(controller, animated: true, completion: nil)
    }
}