2016-10-24 4 views
1

ich zur Zeit mit iOS Entwicklung einer Anwendung 10 und Swift 3iOS 10 Swift 3 UIViewController vorhanden funktioniert nicht

Ich denke, dass ich kann die Navigation zwischen meinen Controller zerstören.

In der Tat, wenn ich versuche, einen neuen View-Controller zu präsentieren, habe ich diese Warnung auf Xcode Debugger.

Warnung: Versuch, FirstViewController auf Project.StoryBoardManager darzustellen, dessen Ansicht nicht in der Fensterhierarchie ist!

Ich habe einige Nachforschungen angestellt, aber ich kann meinen Fehler nicht beheben.

Ich habe diese auf meinem AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    let storyboard = UIStoryboard(name:"Authentication", bundle: nil) 
    let vc = storyboard.instantiateInitialViewController() as UIViewController! 

    self.window?.rootViewController = vc 
    self.window?.makeKeyAndVisible() 

    return true 
} 

Und das auf meiner Klasse präsentieren Nachrichten Ansichten

class StoryBoardManager: UIViewController{ 

fileprivate var appD = UIApplication.shared.delegate as! AppDelegate 

func changeView(storyboardName: String){ 

    let storyboard = UIStoryboard(name: storyboardName, bundle: nil) 
    if let vc = storyboard.instantiateInitialViewController() { 

     vc.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal 
     vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen 

     //appD.window?.rootViewController = vc 
     present(vc, animated: true, completion: nil) 

    } else { 
     print("Unable to instantiate VC from \(storyboardName) storyboard") 
    } 
    } 
override func viewDidLoad(){ 
    super.viewDidLoad() 
} 

Wenn ich das Update von RootViewController die neuen Controller Kommentar nicht vorgestellt .

EDIT für @Zac Kwan

import Foundation 
import UIKit 

class CustomNavBar: UIView { 

    fileprivate let _storyBoardManager : StoryBoardManager = StoryBoardManager() 
fileprivate var _currentUIViewController : UIViewController = UIViewController() 

init() { 
    super.init(frame: CGRect(x: 0, y: 0, width:0, height:0)) 
} 

func changeViewStoryboard(sender: UIButton!){ 

    if (sender.tag == 0){ 
     self._storyBoardManager.changeView(storyboardName: "View1") 
    } else if (sender.tag == 1) { 
     self._storyBoardManager.changeView(storyboardName: "View2") 
    } else if (sender.tag == 2) { 
     self._storyBoardManager.changeView(storyboardName: "View3") 
    } else { 
     self._storyBoardManager.changeView(storyboardName: "View4") 
    } 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

func createButton(title: String, posX: Double, witdh: Double, tag: Int, font: UIFont) -> UIButton { 

    let buttonCreated = UIButton(frame: CGRect(x: posX, y: 0, width: witdh, height: 60)) 
    buttonCreated.setTitle(title, for: UIControlState()) 
    buttonCreated.setTitleColor(CommonVariable.darkGrey, for: UIControlState()) 
    buttonCreated.titleLabel!.font = font 
    buttonCreated.tag = tag 
    buttonCreated.addTarget(self, action:#selector(self.changeViewStoryboard(sender:)), for: UIControlEvents.touchUpInside) 

    buttonCreated.backgroundColor = UIColor.white 

    return buttonCreated 

} 

required init?(coder aDecoder: NSCoder) { 
    Super. Inuit (coder: decoder) 

    addSubview(self.createButton(title: « ChangeView », posX: 256.0, witdh: Double(self._sizeButton) - 1, tag: 1, font: UIFont(name: « Arial », size: 15)!)) 
    addSubview(self.createButton(title: « ChangeView 2 », posX: 512.0, witdh: Double(self._sizeButton) - 1, tag: 2, font: UIFont(name: « Arial », size: 15)!)) 
} 

} 
+0

Die Warnung hat Ihnen gesagt, warum kann es nicht vorhanden ist. Grundsätzlich ist Ihre Klasse 'StoryBoardManager' momentan nicht der' ViewController' in der Fensterhierarchie, daher kann sie keine neue VC darstellen. Können Sie mehr Code zeigen, wie 'changeView' heißt? –

+0

@ZacKwan Ich habe meinen Beitrag aktualisiert. Danke für die Hilfe –

Antwort

-1

Bitte versuchen, den Code zu ändern wie unten:

class StoryBoardManager: UIViewController{ 

fileprivate var appD = UIApplication.shared.delegate as! AppDelegate 

func changeView(storyboardName: String){ 

    let storyboard = UIStoryboard(name: storyboardName, bundle: nil) 
    if let vc = storyboard.instantiateInitialViewController() { 

     vc.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal 
     vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen 

     //appD.window?.rootViewController = vc 
     appD.present(vc, animated: true, completion: nil) 

    } else { 
     print("Unable to instantiate VC from \(storyboardName) storyboard") 
    } 
    } 
override func viewDidLoad(){ 
    super.viewDidLoad() 
} 
Verwandte Themen