2016-12-27 2 views
1

Ich bin eine Kombination aus Objective C und schnell 3.Viewcontroller Laden zweimal

In meinem Mainview (Objective C) unter Verwendung von I die folgende

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

In meinem Drehbuch haben, wird meine Hauptansicht ein Zeigen Navigation Controller, der rootView zur Ansicht von swift 3 ist.

In der schnellen 3-View-Controller ich die folgenden Hinweise und die Loadview und viewDidLoad haben wird zweimal

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


} 

Jeder Vorschlag auf, warum es zweimal aufgerufen wird? Genannt

Auch ich versuche, diese Ansicht zu verlassen, um zurück zur Hauptansicht zu gehen, aber es wird nicht aufgerufen, wenn ich einen Navigationscontroller in der schnellen 3 Ansicht verwende. Ich habe Folgendes versucht. Muss ich eine Abschaltung verwenden, um zur Hauptansicht zurückzukehren?

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

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

Warum instanziieren Sie den View-Controller explizit, wenn ohnehin Storyboard verwenden? – vadian

+0

Haben Sie ein Segment in Storyboard zwischen den beiden ViewControllern? – dirtydanee

+0

Ich habe im Storyboard zwischen der 2-Ansicht ein Segment eingerichtet. Die Kursansicht hat einen Nav-Controller als Root-Ansicht. Ich instanziiere die Ansicht explizit, weil ich das in Ziel c mache, weiß nicht, wie sich das ändert, wenn ich eine objektive c-Implementierung durchführe. Wenn ich es nicht instanziiere, wird die Ansicht nicht nur mit dem Storyboard-Setup aufgerufen. –

Antwort

2

Wenn Sie in Ihrer Anwendung Navigation Controller dann hier eine Sache, ich brauche hier zu löschen, wenn Sie Segue für die Navigation verwendet werden dann wählen mit Hilfe von Code wieder hier die gleiche Ansicht keine Notwendigkeit zu nennen nur eine Prozess hier. Die Navigation hängt davon ab, welchen Typ du drücken, zeigen, modal präsentieren und als Popover präsentieren willst.

Danach müssen nur eine Leitung zu verwenden, um zurück zur Stammansicht anzuzeigen oder zurück: -

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

OR

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

OR
für Rücken RootView

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

Für die Navigation, ein Storyboard zu einem anderen: -

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) 

und versuchen, mit Segue

Erste nee d, um storyBoard-Referenz zu nehmen, dann storyBoardname und dann die referenzierte ID als StoryBoard-ID des ViewControllers.

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

Ausgang wird wie unten Bild -:

add Storyboard reference

und auch Ihr Ziel Controllers Storyboard ID

View Controller's StoryBoard ID

und schließlich PerformSegue mit Daten segue Kennung bestätigen keine Notwendigkeit, irgendwelche zusätzlichen Dinge zu tun : -

OutPut View

+0

Ich verwende ein Segment und im Perform-Segment rufe ich das folgende UIStoryboard * Storyboard = [UIStoryboard storyboardWithName: @ "Storyboard" -Bündel: [NSBundle mainBundle]]; CourseViewController * Kursansicht = (CourseViewController *) [Storyboard instanziateViewControllerWithIdentifier: @ "Kursansicht"]; [self.navigationController pushViewController: courseView animiert: YES]; –

+0

Ich habe alle 3 davon ausprobiert und es nicht ablehnen und zurück zur Stammansicht gehen. Diese funktionieren, wenn ich keine Navigationsansicht als Grundansicht verwende, aber dann verliere ich die Navigationsleiste aller meiner Schaltflächen –

+0

, die Sie in demselben Storyboard oder einem anderen Storyboard durchführen? Wenn Sie von einem Storyboard zu einem anderen Story überführen, aktualisiere ich meine Antwort. –

0

Chech, wenn in dem Sie die loadView() Methode aufgerufen, weil der Code nicht alle Post ist, wenn ist:

Sie nicht loadView() direkt doc

Sie sollten die, accoring auf Apfel nennen sollte Rufen Sie diese Methode niemals direkt auf. Der View-Controller ruft diese Methode auf, wenn seine Ansichtseigenschaft angefordert wird, aber derzeit keine NULL ist. Diese Methode lädt oder erstellt eine Ansicht und weist sie der View-Eigenschaft zu.

Wenn der View-Controller über eine zugeordnete NIB-Datei verfügt, lädt diese Methode die Ansicht aus der NIB-Datei. Ein View-Controller verfügt über eine zugeordnete Nib-Datei, wenn die Eigenschaft nibName einen Nicht-Nil-Wert zurückgibt, der auftritt, wenn der View-Controller aus einem Storyboard instanziiert wurde, wenn Sie ihm explizit eine Nib-Datei mit der Methode init (nibName: bundle :) zugewiesen haben. oder wenn iOS eine Nib-Datei im App-Bundle mit einem Namen findet, der auf dem Klassennamen des View-Controllers basiert. Wenn dem View-Controller keine NIB-Datei zugeordnet ist, erstellt diese Methode stattdessen ein einfaches UIView-Objekt.

Hier sollten Unterklassen ihre benutzerdefinierte Ansichtshierarchie erstellen, wenn sie keine Schreibfeder verwenden. Sollte niemals direkt angerufen werden.

Unabhängig davon, ob Sie die Ansicht für Xib laden oder die Ansicht selbst erstellen, wird viewDidLoad immer aufgerufen, nachdem die Ansicht geladen wurde.

Nehmen Sie folgenden Code:

webView = WKWebView() 

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

view = webView 

loadView()-viewDidLoad(), und löschen Sie die loadView() Methode.


Bearbeiten - 1

Ich schreibe eine Demo für Ihre gemischten Projekt testen, und ich finde, es ist nicht wegen loadView(), habe ich versucht, den Einsatz perform segue und navigationController push verwenden, nicht arbeiten so meine Antwort passt dir nicht, ich finde warum es das Thema in der gemischten Demo gibt, komisch.

+2

Ich kann nicht sehen, wo 'loadView()' in der Frage aufgerufen wird. – vadian

+0

Ich rufe loadView nicht auf, es wird automatisch aufgerufen. Aber in meiner Implementierung werden loadView und viewdidload zweimal ausgelöst, sodass meine Ansicht zweimal geladen wird. –

Verwandte Themen