我使用了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)
答案 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中。
并确认目标控制器的故事板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]
}
}
输出将如下图所示,无需做任何额外的事情: -
答案 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
,但是没有用,所以我的回答不适合你,我发现为什么混合演示中存在问题,很奇怪。