2016-01-31 55 views
1

我在從不同視圖控制器調用數據時遇到問題。如何在關閉視圖後手動調用ViewDidAppear?

Illustrate

當應用程序啓動時,它進入1,並立即進入2作爲圖2是主視圖。然後 2將立即檢查是否有人之前註冊,結果如下:

A - 如果進入登錄視圖控制器結果負

乙 - 調用一個函數來在viewDidAppear照常下載數據(這是不是現在,我的問題)

我的問題是,當A發生,用戶將進入他的病人ID,並與服務器進行通信,它應該成功通過驗證,那麼它會解僱自己,並返回到瀏覽器2.

當它返回到視圖控制器2時,我期望我t照常運行viewDidAppear和DOWNLOAD DATA。

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    print("First view appeared") 
    let prefs = NSUserDefaults.standardUserDefaults() 

    //if an user has logged in 
    let isLoggedIn = prefs.integerForKey("ISLOGGEDIN") as Int 
    if (isLoggedIn != 1){ 
     print("No user currently, so heading to login screen") 
     self.performSegueWithIdentifier("gotoLogin", sender: self) 
    }else{ 
     print("ViewDidAppear: An user has been logged in") 
     let permissionToLoadData = prefs.integerForKey("ISLOGGEDIN") 

     if (permissionToLoadData != 1) { 
      print("Please grant permission to get data") 
     }else{ 
      print("First view: connecting to database") 

      reportStatus() 
      socket.connect() 

      readDataFromSocket(){ data in 
       let json = JSON(data) 
       let nou = json[0].count 
       if nou > 0 { 
        print("Test(1st VC): grabbing data from database") 
        for var i=0; i<nou; ++i{ 
         numberOfUsersExisting = nou 
         pSample += [Patient(id: json[0][i]["ID"].intValue, name: json[0][i]["Name"].stringValue, gender: json[0][i]["Gender"].stringValue, mileage: json[0][i]["Mileage"].doubleValue)] 
         pSample.sortInPlace({$0.globalPatientMileAge < $1.globalPatientMileAge}) 
        } 
        print("Successfully grabbed data") 
       }else{ 
        print("No user in the database") 
        numberOfUsersExisting = 0 
       } 
      }//readDataFromSocket 
     }//permission to load data 
    } 
}//end of viewDidAppear 

但是它沒有這樣做我所期待的,嗯,所以反正是有,我可以viewDidAppear(從視圖控制器2)調出登錄辭退視圖控制器動作之後吧?

+0

你不知道。永遠不要手動調用生命週期方法。 – nhgrif

+0

你是否確實在說有辦法做到這一點,但我們不應該這樣做?如果有的話,你介意告訴我該怎麼做到這一點? :) –

+3

不可能。沒有機會,在將來的某個時候,我可能不得不維護你寫的代碼,我不會告訴你如何去做那些荒謬的做法。 – nhgrif

回答

0

您可以將下載數據邏輯與其他方法分開,並在您需要時調用。所以聲明一個正在下載數據的函數。

let prefs = NSUserDefaults.standardUserDefaults() 

func downloadingData() { 
    print("ViewDidAppear: An user has been logged in") 
    let permissionToLoadData = prefs.integerForKey("ISLOGGEDIN") 

    if (permissionToLoadData != 1) { 
     print("Please grant permission to get data") 
    }else{ 
     print("First view: connecting to database") 

     reportStatus() 
     socket.connect() 

     readDataFromSocket(){ data in 
      let json = JSON(data) 
      let nou = json[0].count 
      if nou > 0 { 
       print("Test(1st VC): grabbing data from database") 
       for var i=0; i<nou; ++i{ 
        numberOfUsersExisting = nou 
        pSample += [Patient(id: json[0][i]["ID"].intValue, name: json[0][i]["Name"].stringValue, gender: json[0][i]["Gender"].stringValue, mileage: json[0][i]["Mileage"].doubleValue)] 
        pSample.sortInPlace({$0.globalPatientMileAge < $1.globalPatientMileAge}) 
       } 
       print("Successfully grabbed data") 
      }else{ 
       print("No user in the database") 
       numberOfUsersExisting = 0 
      } 
     }//readDataFromSocket 
    }//permission to load data 
} 

然後在viewDidLoad()上打電話給它。

override func viewDidLoad() { 
    super.viewDidLoad() 
    //if an user has logged in 
    let isLoggedIn = prefs.integerForKey("ISLOGGEDIN") as Int 
    if (isLoggedIn != 1){ 
     print("No user currently, so heading to login screen") 
     self.performSegueWithIdentifier("gotoLogin", sender: self) 
    }else{ 
     downloadingData() 
    } 
} 

此外,當關閉視圖控制器。

dismissViewControllerAnimated(true) { 
    viewController.downloadingData() 
} 
+0

太糟糕了,我無法做到這一點,因爲一旦viewDidLoad運行,數據將立即下載並暴露給控制檯,然後用戶從服務器進行身份驗證。 –

+0

對不起,我更詳細地檢查了邏輯,你會再檢查一次嗎? –

+0

由於某種原因,它現在將像往常一樣進行身份驗證,但它並未完全消除,並且函數downloadData()也不會調用。 –

相關問題