2015-04-06 27 views
0

我想重新加載我的表視圖控制器從我的左側菜單(滑出)當用戶註銷表中的標籤設置爲「只會員」。因此,我叫refreshAuctionLatestViewController.viewWillAppear(true)。但是,在該方法中重新加載的表視圖是nil.Any幫助?iWhy當我從另一個視圖控制器調用我的表視圖爲零?

這裏是我的滑動菜單控制器(SlideMenu)

import UIKit 


class LeftMenuViewController: UIViewController ,UITableViewDataSource, UITableViewDelegate{ 

@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var userEmail: UIButton! 
@IBOutlet weak var btnLogOut: UIButton! 
var refreshActionLatestController:AuctionLatestViewController! 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 

    let isLoggedIn = TegKeychain.get("isLoginIn") 
    let userEmail = TegKeychain.get("userEmail_keyChain") 
    if (isLoggedIn != "1") { 
     self.btnLogOut.enabled = false 
     self.btnLogOut.hidden = true 
     self.userEmail.enabled = true 
    }else if userEmail != nil{ 
     self.userEmail.titleLabel?.text = userEmail 
     self.userEmail.enabled = false 
     self.btnLogOut.enabled = true 
     self.btnLogOut.hidden = false 
    } 
} 
@IBAction func logoutTapped(sender : UIButton) { 

    refreshActionLatestController = AuctionLatestViewController() 

    self.slideMenuController()?.closeLeft() //Closing the Slide and show user with alert on main view controller 

    let logOutAlertController = UIAlertController(title : "Log Out",message: "Are You Sure You Gonna Log Out?",preferredStyle : .ActionSheet) 

    let callAction = UIAlertAction(title: "Log Out", style: .Default, handler: { 
     action in 

     var token:NSString = TegKeychain.get("userToken_keyChain")! 
     var email:NSString = TegKeychain.get("userEmail_keyChain")! 

     var params : Dictionary <String,String> = ["appid" : token, "email" : email] 
     var params2 = self.createStringFromDictionary(params) 
     var paramsLength = "\(countElements(params2))" 

     var err: NSError? 

     NSLog("PostData: %@",params2); 

     var url:NSURL = NSURL(string:"http://localhost:8080/xx/xxx/account/logout")! 

     var requestBodyData = (params2 as NSString).dataUsingEncoding(NSUTF8StringEncoding) 


     var request:NSMutableURLRequest = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "POST" 
     request.HTTPBody = requestBodyData 
     request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
     request.setValue("application/json", forHTTPHeaderField: "Accept") 


     var reponseError: NSError? 
     var response: NSURLResponse? 

     var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError) 

      if (urlData != nil) { 
       let res = response as NSHTTPURLResponse!; 

       NSLog("Response code: %ld", res.statusCode); 

       if (res.statusCode >= 200 && res.statusCode < 300) 
       { 
        var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)! 

        NSLog("Response ==> %@", responseData); 

        var err: NSError? 

        let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &err) as NSDictionary 

        let status:NSString = jsonData.valueForKey("status") as NSString 

        //let error:NSString = jsonData.valueForKey("error") as NSString 

        NSLog("Status:", status); 
        NSLog("Error:", status); 

        if(status == "ok") 
        { 
         NSLog("Log Out SUCCESS"); 

         TegKeychain.delete("userEmail_keyChain") 
         TegKeychain.delete("isLoginIn") 
         TegKeychain.delete("userToken_keyChain") 
         TegKeychain.delete("userName_keyChain") 



    self.refreshActionLatestController?.viewWillAppear(true) //doesn't work,keep showing me nil at carTableView 
    //self.refreshActionLatestController?.searchForResults(true) 
    // I already initialize that main view controlller,but table view of that main view still showing nil when i created output of it. 

         self.userEmail.titleLabel?.text = "Sign In" 
         self.userEmail.enabled = true 
         self.btnLogOut.enabled = false 
         self.btnLogOut.hidden = true 
        } 
        else if status == "error"{ 

         var alertView:UIAlertView = UIAlertView() 
         alertView.title = "Log Out Failed!" 
         alertView.message = "Connection Failed" 
         alertView.delegate = self 
         alertView.addButtonWithTitle("OK") 
         alertView.show() 
        } 
       } else { 
        TegKeychain.delete("userEmail_keyChain") 
        TegKeychain.delete("isLoginIn") 
        TegKeychain.delete("userToken_keyChain") 
        TegKeychain.delete("userName_keyChain") 

        self.userEmail.titleLabel?.text = "Sign In" 
        self.btnLogOut.enabled = false 
        self.btnLogOut.hidden = true 
        self.dismissViewControllerAnimated(true, completion: nil) 

        var alertView:UIAlertView = UIAlertView() 
        alertView.title = "Already Log Out!" 
        alertView.message = "You account has been already log out" 
        alertView.delegate = self 
        alertView.addButtonWithTitle("OK") 
        alertView.show() 
       } 
      } 
      else { 
       var alertView:UIAlertView = UIAlertView() 
       alertView.title = "Log Out Failed!" 
       alertView.message = "Connection Failed" 
       alertView.delegate = self 
       alertView.addButtonWithTitle("OK") 
       alertView.show() 
      } 
     } 
    ) 
    logOutAlertController.addAction(callAction) 

    let defaultAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil) 
    logOutAlertController.addAction(defaultAction) 
    presentViewController(logOutAlertController, animated: true, completion: nil) 
} 

func createStringFromDictionary(dict: Dictionary<String,String>) -> String { 
    var params = String() 
    for (key, value) in dict { 
     params += "&" + key + "=" + value 
    } 
    return params 
} 
} 

這裏是我的主視圖控制器[這是拍賣汽車名單]

import UIKit 

class AuctionLatestViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,AuctionAPIProtocol{ 

@IBOutlet var carTableView : UITableView? 
@IBOutlet var carTableIndicator : UIActivityIndicatorView? 
@IBOutlet var retryButton:UIButton? 

var latestCars = [AuctionModel]() 
var api : AuctionAPI? 
var imageCache = [String : UIImage]() 
var token : String = " " 
var lotId : String = " " 
var page : String = " " 

override func viewDidLoad() { 
    println("Auction Latest : viewDidLoad") 
    super.viewDidLoad() 
    self.setNavigationBarItem() 
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) 

    carTableView?.hidden = true 
    retryButton?.hidden=true 
    carTableIndicator?.center 
    carTableIndicator?.startAnimating() 

    if TegKeychain.get("userToken_keyChain") == nil{ 
     token = "null" 
    } 
    else{ 
     token = TegKeychain.get("userToken_keyChain")! 
    } 
    lotId = "1" 
    page = "1" 

    api = AuctionAPI(delegate: self) 
    api!.searchAuctionLatestFor(token,lotId: lotId,page: page) 
} 

override func viewWillAppear(animated: Bool) { 
    println("Auction Latest : ViewWillAppear") 

    super.viewWillAppear(animated) 
    self.setNavigationBarItem() 
    if TegKeychain.get("userToken_keyChain") == nil{ 
     token = "null" 
    } 
    else{ 
     token = TegKeychain.get("userToken_keyChain")! 
    } 
    lotId = "1" 
    page = "1" 
    api = AuctionAPI(delegate: self) 
    api!.searchAuctionLatestFor(token,lotId: lotId,page: page) 
} 

//Table View DataSource and Delegate 

// Implementing the json results from api. 
func didReceiveAPIResults(results: NSDictionary) { 
    var resultsArr: NSArray = results["body"] as NSArray //fix 
    dispatch_async(dispatch_get_main_queue(), { 
     self.latestCars = AuctionModel.latestWithJSON(resultsArr) 
     println(self.carTableView) 

     self.carTableView?.reloadData() // I reload the table view 
     println(self.carTableView)// which return nil when i called from Slide Menu Controller.But return data,if the main view controller called. 

     self.retryButton?.hidden=true 
     self.retryButton?.enabled=false 
     self.carTableIndicator?.stopAnimating() 
     self.carTableView?.hidden = false 
    }) 
} 

// The function that i call from slide menu when log out 
func searchForResults(search:Bool){ 
    println("Search Again") 

    retryButton?.enabled=false 
    retryButton?.hidden=true 
    carTableIndicator?.startAnimating() 
    api = AuctionAPI(delegate: self) 

    if TegKeychain.get("userToken_keyChain") == nil{ 
     token = "null" 
    } 
    else{ 
     token = TegKeychain.get("userToken_keyChain")! 
    } 
    lotId = "1" 
    page = "1" 

    api = AuctionAPI(delegate: self) 
    api!.searchAuctionLatestFor(token,lotId: lotId,page: page) 
    //it will go to didReceiveAPIResults() method 
} 

這裏是我的控制檯輸出,你會見下面的零。

PostData: &appid=9cdcf896d1f54c3c11b0d4839ce26775 
Response ==> {"status":"authorized"} 
Status: 
Already Sign In 
Auction Latest : viewDidLoad 
Auction Latest : ViewWillAppear 
task completed 
Optional(<UITableView: 0x7faa9c852000; framet a=s k(0c o0m;p l3e2t0e d5 
68); clipsToBounds = YES; hidden = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7faa9bda1f00>; layer = <CALayer: 0x7faa9bd9e750>; contentOffset: {0, -64}; contentSize: {320, 0}>) 
Optional(<UITableView: 0x7faa9c852000; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7faa9bda1f00>; layer = <CALayer: 0x7faa9bd9e750>; contentOffset: {0, -64}; contentSize: {320, 91}>) 
Auction Latest : ViewWillAppear 
task completed 
Optional(<UITableView: 0x7faa9c852000; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7faa9bda1f00>; layer = <CALayer: 0x7faa9bd9e750>; contentOffset: {0, -64}; contentSize: {320, 91}>) 
Auction Latest : ViewWillAppear 
task completed 
Optional(<UITableView: 0x7faa9c852000; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7faa9bda1f00>; layer = <CALayer: 0x7faa9bd9e750>; contentOffset: {0, -64}; contentSize: {320, 91}>) 
PostData: &[email protected]&appid=9cdcf896d1f54c3c11b0d4839ce26775 
Response code: 200 
Response ==> {"status":"ok"} 
Status: 
Error: 
Log Out SUCCESS 
Auction Latest : ViewWillAppear 
task completed 
nil 

任何想法?任何建議?我離開了意見,我problem.Hope此幫助

回答

0

用於更新該菜單中,您必須在其中調用您已經採取了表視圖,併爲該類的方法你做了一件事, 創建該類的對象到你想要更新的其他類中,然後通過該類的方法調用該類的方法,例如..

[sliderpage viewWillAppear:YES];

這裏silderpage是菜單頁的對象....

我希望這可以幫助全給你....

+0

嗯如果妳不介意,請迅速解釋,因爲我不知道什麼關於你說的。通過你解釋的外觀,我用AuctionLatestViewController初始化了refreshActionLatestController(參見左側菜單控制器的頂部)。並且我調用了這個視圖控制器類,就像這個「self.refreshActionLatestController?.viewWillAppear(true)」在左邊當用戶點擊註銷時,菜單控制器。所以,這也解決不了。我更新了代碼 – 2015-04-06 11:47:57

+0

對不起,我不知道迅速好 – 2015-06-09 09:35:12

相關問題