Ios ViewController加载两次

Ios ViewController加载两次,ios,objective-c,swift3,Ios,Objective C,Swift3,我使用的是目标C和swift 3的组合 在我的主要观点(目标C)中,我有以下几点 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle mainBundle]]; CourseViewController *courseView = (CourseViewController*)[storyboard instantiateViewControllerW

我使用的是目标C和swift 3的组合

在我的主要观点(目标C)中,我有以下几点

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle mainBundle]];
    CourseViewController *courseView = (CourseViewController*)[storyboard instantiateViewControllerWithIdentifier:@"courseView"];
    [self.navigationController pushViewController:courseView animated:YES];
在我的故事板中,我的主视图将显示一个导航控制器,它将根视图转换为swift 3视图

在swift 3视图控制器中,我有以下内容,loadView和viewDidLoad被调用两次

override func loadView() {
    webView = WKWebView()

    //If you want to implement the delegate
    webView?.navigationDelegate = self

    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()
    let temp: CGRect = UIScreen.main.bounds
    screenSize = temp
    let url = URL(string: kcourseURL)
    let req = URLRequest(url: url!)
    webView.allowsBackForwardNavigationGestures = true
    webView.load(req)
    //webView.frame = CGRect(x:0, y:navBarHeight, width:Int(screenSize.width), height:Int(screenSize.height))

    webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil)

    self.setBarButton()


}
有没有关于为什么要叫两次的建议

此外,我试图关闭此视图以返回主视图,但如果在swift 3视图上使用导航控制器,则不会调用此视图。我试过以下方法。我是否需要使用segue unwind返回主视图

        self.dismiss(animated: true, completion: nil)

    _ = self.navigationController?.popToRootViewController(animated: true)

检查调用
loadView()
方法的位置,因为您的代码不全是post,如果是:

根据苹果的建议,您不应该直接调用
loadView()

永远不要直接调用此方法。视图控制器在其视图属性被请求但当前为nil时调用此方法。此方法加载或创建视图,并将其指定给视图属性

如果视图控制器具有关联的nib文件,则此方法从nib文件加载视图。如果nibName属性返回非nil值,则视图控制器具有关联的nib文件。如果视图控制器是从故事板实例化的,如果您使用init(nibName:bundle:)方法显式为其分配了一个nib文件,或者如果iOS在应用程序包中找到了一个名称基于视图控制器类名的nib文件,则会出现这种情况。如果视图控制器没有关联的nib文件,则此方法将创建普通UIView对象

如果子类不使用nib,则应在此处创建其自定义视图层次结构。不应该直接呼叫

无论您为Xib加载视图还是自己创建视图,
viewDidLoad
都将在加载视图后被调用

请在下面输入您的代码:

webView = WKWebView()

//If you want to implement the delegate
webView?.navigationDelegate = self

view = webView
loadView()
viewDidLoad()
,并删除
loadView()
方法


编辑-1


我已经为测试您的混合项目编写了一个演示,我发现这不是因为
loadView()
,我尝试使用
perform segue
navigationController push
,没有工作,所以我的答案不适合您,我正在查找混合演示中出现问题的原因,奇怪。

如果您在应用程序导航控制器中使用,那么这里有一件事我需要澄清,如果您使用Segue进行导航,那么无需在代码的帮助下再次调用相同的视图。导航将取决于您想要的类型,如推送、显示、以模态呈现和以popover呈现

之后,只需使用一行返回到视图或返回到根视图:-

 self.dismiss(animated: true, completion: nil)

_ = self.navigationController?.popViewController(animated: true)

对于back Rootview

_ = self.navigationController?.popToRootViewController(animated: true)
对于导航,请将一个故事板切换到另一个:-

目标-C

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *second = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self.navigationController pushViewController:second animated:YES];
Swift 3

let storyboard = UIStoryboard(name: "Customer", bundle: nil)
let secondVC =   storyboard.instantiateViewController(withIdentifier: "SecondVC") as! SecondVC
self.navigationController!.pushViewController(secondVC, animated: true)
并尝试使用Segue

首先需要获取情节提要引用,然后添加情节提要名称,然后添加内部引用Id作为ViewController的情节提要Id

并确认目标控制器的故事板ID

最后使用数据序列标识符执行查询:-

 let segueIdentifier = "fourthView"

 //MARK: - Navigation
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == segueIdentifier {
          let controller = segue.destination as! FourthVC
          //Passing Values here
          controller.promoViewModel =  promotionModel[0]
        }
    }
输出如下图所示,无需做任何额外的事情:-


为什么在使用情节提要时要显式实例化视图控制器?在两个视图控制器之间的
情节提要中是否设置了segue?我在2个视图之间的情节提要中设置了segue。航向视图有一个导航控制器作为根视图。我显式地实例化视图,因为我在目标c中这样做,不知道当我执行目标c到Swift实现时,视图会发生怎样的变化。如果我不实例化它,视图就不会仅通过脚本设置被调用。我看不出问题中调用了
loadView()
。我没有调用loadView,它是自动调用的。但在我的实现中,loadView和viewdidload被触发两次,因此我的视图被加载两次。我使用一个segue,在执行segue中,我调用以下UIStoryboard storyboard=[UIStoryboard storyboard WithName:@“storyboard”bundle:[NSBundle mainBundle];CourseViewController*courseView=(CourseViewController)[情节提要实例化的CourseViewController标识符:@“courseView”];[self.navigationController pushViewController:courseView动画:是];我已经尝试了所有这三种方法,但它并没有退出并返回到根视图。如果我不使用导航视图作为根视图,但是我丢失了所有按钮的导航栏,那么这些都可以工作。您在同一个故事板或另一个故事板中执行segue吗?如果你在这里从一个故事板转到另一个故事板,我会更新我的答案。谢谢。看起来我唯一需要的是[self-PerformsgueWithIdentifier:@“training”发件人:self];然后是故事板上的一段叫做训练的片段。我在prepareForSegue中添加了另一个调用,再次触发了视图。谢谢你的帮助!