2016-12-27 3 views
1

Я использую комбинацию цели С и быстрое 3.ViewController загрузки дважды

В моей MainView (Objective C) У меня есть следующие

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

В моей раскадровки, мой MainView будет показывать Контроллер навигации, который является rootView для быстрого просмотра.

В стремительном контроллер 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, но он не вызван, если я использую контроллер навигации в режиме быстрого просмотра 3. Я пробовал следующее. Нужно ли использовать segue, чтобы вернуться в mainView?

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

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

Почему инстанцирование контроллера представления в явном виде при использовании раскадровки в любом случае? – vadian

+0

У вас есть segue, созданный в 'Storyboard' между двумя viewControllers? – dirtydanee

+0

У меня есть настройка в раскадровке между двумя видами. В представлении курса есть навигационный контроллер в качестве корневого представления. Я создаю экземпляр явно, потому что я делаю это в объективе c, не знаю, как это изменяется, когда я выполняю задачу c с помощью Swift. Если я не создаю экземпляр, представление не будет вызвано только с настройкой раскадровки. –

ответ

2

Если вы используете в вашем приложении навигации контроллера, то здесь одна вещь, мне нужно, чтобы очистить здесь, если вы используете Segue для навигации, то нет необходимости вызывать ту же точку зрения снова здесь с помощью кода выбрать только один процесс здесь. Навигация будет зависеть от вас, какого типа вы хотите, как нажать, показать, представить модально и представить как popover.

после этого нужно использовать только одну строку для назад, чтобы просмотреть или вернуться к корневой зрения: -

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

ИЛИ

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

ИЛИ
для спины Rootview

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

Для навигации, один StoryBoard другому: -

Objective-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

Первая урожденной d, чтобы взять справку storyBoard, затем добавить storyBoardname, а затем добавить внутри ссылочного идентификатора в качестве идентификатора StoryBoard вашего ViewController.

add Storyboard reference

, а также подтвердить свой контроллер-адресата раскадровки ID

View Controller's StoryBoard ID

и, наконец, PerformSegue с идентификатором SEGUE данные: -

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

+0

Я использую segue и в Perform segue, я вызываю следующий UIStoryboard * storyboard = [UIStoryboard storyboardWithName: @ «Раскадровка»: [NSBundle mainBundle]]; CourseViewController * courseView = (CourseViewController *) [раскадровка instantiateViewControllerWithIdentifier: @ "courseView"]; [self.navigationController pushViewController: courseView animated: YES]; –

+0

Я пробовал все 3 из них, и он не отклоняется и возвращается к корневому представлению. Они работают, если я не использую навигационное представление в качестве корневого представления, но затем я теряю навигационную панель всех своих кнопок –

+0

, которые вы выполняете в той же раскадровке или другой раскадровке? Если вы выполняете segue из одной раскадровки в другую историю, я обновляю свой ответ. –

0

Chech если где вызывается метод loadView(), потому что ваш код не все сообщение, если есть:

Вы не должны вызывать loadView() непосредственно, Согласно наблюдениям яблока doc

Вы должны никогда не вызывайте этот метод напрямую. Контроллер вида вызывает этот метод, когда запрашивается его свойство вида, но в настоящее время оно равно нулю. Этот метод загружает или создает представление и присваивает его свойству view.

Если контроллер вида имеет связанный файл nib, этот метод загружает представление из файла nib. Контроллер представления имеет связанный файл nib, если свойство nibName возвращает значение non-nil, которое возникает, если контроллер представления был создан из раскадровки, если вы явно присвоили ему файл nib с помощью метода init (nibName: bundle :), или если iOS находит файл nib в комплекте приложения с именем, основанным на имени класса контроллера представления. Если в контроллере представления нет связанного файла nib, этот метод создает вместо него простой объект UIView.

Здесь подклассы должны создавать свою собственную иерархию представлений, если они не используют нить. Никогда не следует называть напрямую.

Независимо от того, как вы загружаете представление для Xib или создаете представление самостоятельно, viewDidLoad всегда будет вызываться после загрузки вида.

Возьмите код ниже:

webView = WKWebView() 

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

view = webView 

от loadView() к viewDidLoad(), и удалите метод loadView().


Edit - 1

меня написать демо-версию для тестирования смешанного проекта, и я считаю его не из-за loadView(), я попытался использовать perform segue и использовать navigationController push, не получилось, так что я ответ не подходит вам, я нахожу, почему есть проблема в смешанной демонстрации, странно.

+2

Я не вижу, где 'questionView()' вызывается в вопросе. – vadian

+0

Я не называю loadView, это называется автоматически. Но в моей реализации loadView и viewdidload запускаются дважды, поэтому мой просмотр загружается дважды. –

Смежные вопросы