ViewController加载两次

时间:2016-12-27 15:44:12

标签: ios objective-c swift3

我使用了Objective C和swift 3的组合。

在我的mainView(Objective C)中,我有以下内容

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle mainBundle]];
    CourseViewController *courseView = (CourseViewController*)[storyboard instantiateViewControllerWithIdentifier:@"courseView"];
    [self.navigationController pushViewController:courseView animated:YES];

在我的故事板中,我的mainView将向swift 3视图显示导航控制器的rootView。

在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()


}

有关为何被召唤两次的任何建议?

此外,我试图忽略此视图以返回到mainView,但如果我在swift 3视图上使用导航控制器,则不会调用它。我尝试了以下方法。我是否需要使用segue unwind返回mainView?

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

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

2 个答案:

答案 0 :(得分:3)

如果您在应用程序导航控制器中使用,那么在这里我需要清楚一件事情,如果您使用 Segue 进行导航,那么在的帮助下无需再次调用相同的视图>代码在这里只选择一个进程。导航将取决于您想要推送,显示,呈现模式和呈现为弹出窗口的类型。

之后需要只使用一行来返回查看或返回根视图: -

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

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


for backview

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

对于导航,一个StoryBoard到另一个: -

<强>目标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

首先需要使用storyBoard引用,然后添加storyBoardname,然后将Referenced Id添加到ViewController的StoryBoard ID中。

add Storyboard reference

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

View Controller's StoryBoard ID

最后使用数据segue标识符执行PerformSegue: -

 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]
        }
    }

输出将如下图所示,无需做任何额外的事情: -

OutPut View

答案 1 :(得分:0)

如果你调用了loadView()方法,那就去了,因为你的代码不是全部发布的,如果是:

你不应该直接致电loadView(),而是要注意苹果doc

  

你永远不应该直接调用这个方法。视图控制器在请求其view属性但当前为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,但是没有用,所以我的回答不适合你,我发现为什么混合演示中存在问题,很奇怪。