Ios ViewController加载两次
我使用的是目标C和swift 3的组合 在我的主要观点(目标C)中,我有以下几点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
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中添加了另一个调用,再次触发了视图。谢谢你的帮助!