簡體   English   中英

注銷時清除所有視圖控制器

[英]Clear All View Controllers On Logout

我注意到當用戶注銷時,所有以前的視圖控制器對象仍然存儲在內存中

注銷頁面中的當前代碼:

 @IBAction func LogOutClicked(sender: AnyObject)
{
    let appDomain = NSBundle.mainBundle().bundleIdentifier
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain!)
    self.performSegueWithIdentifier("goto_loginpage", sender: self)

}

主頁上的當前代碼:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated);


    MyVariables.prefs = NSUserDefaults.standardUserDefaults()
    let isLoggedIn:Int = MyVariables.prefs.integerForKey("ISLOGGEDIN") as Int

    //not logged in
    if (isLoggedIn != 1)
    {
        self.performSegueWithIdentifier("goto_login", sender: self)
    }
        //logged in
    else
    {
      // Start Filling objects with data
    }
}

Logout按鈕位於一個單獨的視圖控制器上,而不是我試圖從內存中清除的視圖控制器並從中刪除所有對象

您可以將app delegate的window.rootViewController屬性替換為您的登錄屬性(但您無法獲取動畫)

如果您的根視圖控制器是navigationController,那么首先調用performSegueWithIdentifier並在登錄視圖出現后在登錄視圖控制器的viewDidAppear函數中嘗試此操作。

此外,您還應確保在代碼中對先前的視圖控制器有任何強有力的引用。

navigationController?.viewControllers = [self]

我找到了這篇文章 雖然它是指單身人士,但它可能有所幫助:

我認為答案不在於破壞單例對象並重新創建它,而是要實際清除該單例對象中的實例變量。

您沒有顯示[CSAppData inbox]的聲明,但是如果它是一個NSMutableArray ,那么您可以清除它,並且對單例對象的任何現有引用都可以保留:

 +(void) clearData { CSAppData *appData = [CSAppData appData]; [appData.inbox removeAllObjects]; } 

可能必須閱讀該問題以獲取代碼的某些上下文,但此變體可能有效:

func init() -> AnyObject {
    self = super()
    if self {
        self.inbox = CSInbox()
    }
    return self
}

class func appData() -> CSAppData {
    static var appDataInstance: CSAppData
            if !appDataInstance {
            appDataInstance = CSAppData()
        }

    return appDataInstance
}

class func clearData() {
    var appData: CSAppData = CSAppData.appData()
    appData.inbox.removeAllObjects()
}

我用clearData函數替換了clearData函數,而在那里使用了舊函數。

CSInbox 你可能會忽略這一點,但我不確定。 我認為這被一個帶有結構的類所取代

class CSInbox: NSObject {
    var threads: [AnyObject]?

    var newCount: Int?

    var lastUpdate: NSDate?

    func setThreadsFromJSON(json: [NSObject : AnyObject]) {
    }
}

CSInboxViewController被視圖控制器取代

class CSInboxViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate, CSThreadViewControllerDelegate {
    @IBOutlet var inboxTableView: UITableView!

    var inbox: CSInbox?  // <=== This is replaced with variables containing your class(es)
}

這是CSAppData類:

class CSAppData: NSObject {
    var inbox: CSInbox?  // <=== This is replaced with variables containing your class(es)

    class func appData() -> CSAppData {
    }

    class func clearData() {
    }
}

我會根據需要繼續更新這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM