2016-08-10 5 views
0

ich eine dritte Partei pod KGFloatingDrawer bin mit das ist toll, weil es diese erreicht:Swapping centreViewControllers mit FloatingDrawers

Floating drawer bliss in iOS

und ist eine Neuimplementierung von JVFloatingDrawer. Ich habe ihren Beispielcode benutzt und die Schubladen funktionieren großartig!

ABER

Als ich meine app laufen nenne ich einen centreViewController ohne Schubladen (Login). Dann nach der Anmeldung nenne ich einen neuen centreViewController mit

appDelegate.centerViewController = appDelegate.navigationBarController()

, die nur funktionieren, wenn ich die App neu zu starten. Fehle ich etwas?

Die Logout scheint in Ordnung, obwohl

appDelegate.centerViewController = appDelegate.drawerSettingsViewController() 

, die mich ein wenig verwirrt, weil dann denke ich, dass ich auf dem richtigen Weg bin?

soll ich nur normale segues und solche zuerst verwenden und dann nur den drawerViewController aufrufen?

ist der andere Code, wenn die schwimmenden Schubladen einrichten:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    window = UIWindow(frame: UIScreen.mainScreen().bounds) 

    window?.rootViewController = drawerViewController 

    window?.makeKeyAndVisible() 

    return true 
} 

private var _drawerViewController: KGDrawerViewController? 
var drawerViewController: KGDrawerViewController { 
    get { 
     if let viewController = _drawerViewController { 
      return viewController 
     } 
     return prepareDrawerViewController() 
    } 
} 

func prepareDrawerViewController() -> KGDrawerViewController { 
    let drawerViewController = KGDrawerViewController() 

    drawerViewController.centerViewController = drawerSettingsViewController() 
    drawerViewController.leftViewController = leftViewController() 
    drawerViewController.rightViewController = rightViewController() 
    drawerViewController.backgroundImage = UIImage(named: "sky3") 

    _drawerViewController = drawerViewController 

    return drawerViewController 
} 

private func drawerStoryboard() -> UIStoryboard { 
    let storyboard = UIStoryboard(name: StoryboardIDs.MainStoryBoardID , bundle: nil) 
    return storyboard 
} 

private func viewControllerForStoryboardId(storyboardId: String) -> UIViewController { 
    let viewController: UIViewController = drawerStoryboard().instantiateViewControllerWithIdentifier(storyboardId) 
    return viewController 
} 

func drawerSettingsViewController() -> UIViewController { 
    let viewController = viewControllerForStoryboardId(StoryboardIDs.LoginViewConSid) 
    return viewController 
} 

func sourcePageViewController() -> UIViewController { 
    let viewController = viewControllerForStoryboardId(StoryboardIDs.SettingsViewConID) 
    return viewController 
} 

func navigationBarController() -> UIViewController{ 
    let viewController = viewControllerForStoryboardId(StoryboardIDs.NavConSid) 
    return viewController 
} 

private func leftViewController() -> UIViewController { 
    let viewController = viewControllerForStoryboardId(StoryboardIDs.LeftViewConID) 
    return viewController 
} 

private func rightViewController() -> UIViewController { 
    let viewController = viewControllerForStoryboardId(StoryboardIDs.RightViewConID) 
    return viewController 
} 

func toggleLeftDrawer(sender:AnyObject, animated:Bool) { 
    _drawerViewController?.toggleDrawer(.Left, animated: animated, complete: { (finished) -> Void in 
     // do nothing 
    }) 
} 

func toggleRightDrawer(sender:AnyObject, animated:Bool) { 
    _drawerViewController?.toggleDrawer(.Right, animated: animated, complete: { (finished) -> Void in 
     // do nothing 
    }) 
} 

func closeDrawer(sender:AnyObject, animated:Bool){ 
    _drawerViewController?.closeDrawer(.Left, animated: animated, complete: { (finished) -> Void in 

    }) 
} 

private var _centerViewController: UIViewController? 
var centerViewController: UIViewController { 
    get { 
     if let viewController = _centerViewController { 
      return viewController 
     } 
     return drawerSettingsViewController() 
    } 
    set { 
     if let drawerViewController = _drawerViewController { 
      drawerViewController.closeDrawer(drawerViewController.currentlyOpenedSide, animated: true) { finished in } 
      if drawerViewController.centerViewController != newValue { 
       drawerViewController.centerViewController = newValue 
      } 
     } 
     _centerViewController = newValue 
    } 
} 

Jede Hilfe/Vorschläge würden geschätzt: D

Antwort

0

Nur würde dies hier angehängt, falls jemand ähnliche Probleme hat.

Nach einer Woche lang kämpfen, um das Problem zu finden. Schließlich fand ich, dass, wenn ich änderte die centreViewController mit

appDelegate.centerViewController = appDelegate.navigationBarController() 

ODER

appDelegate.centerViewController = appDelegate.logoutController() 

, dass die Methoden

deinit { 
    print("deinit called") 
    notifCentre.removeObserver(self) 
} 

nicht in einem der Viewcontrollers genannt wurden.

So habe ich die Linie

self.dismissViewControllerAnimated(false, completion: {}) 

jedes Mal, dass ich die centreViewController ändern.

Scheinbar Swift normalerweise normalautagisch, aber wenn die Verwendung der Methoden von Drittanbietern gibt es einige Verwirrung mit dem Speicherhandler und wir müssen eingreifen. Gut zu wissen, obwohl es auch eine allgemeine schnelle Problem sein könnte.