I am trying to reload my table view controller from my left menu(slide out) when user log out by setting the labels in the table view to "ONLY MEMBER".So,i called refreshAuctionLatestViewController.viewWillAppear(true).But,the table view that will reload in that method was nil.Any Helps?
Here is my Slide Menu Controller (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
}
}
Here is My Main View Controller [which are the list of Auction Cars]
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
}
Here is my console output,you will see nil at below.
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=example.test@gmail.com&appid=9cdcf896d1f54c3c11b0d4839ce26775
Response code: 200
Response ==> {"status":"ok"}
Status:
Error:
Log Out SUCCESS
Auction Latest : ViewWillAppear
task completed
nil
Any Idea?Any Suggestion?I left comment for my problem.Hope this help
for update that menu you have to call method of that class in which you have taken that table view and for that you do one thing, create a object of that class into other class from where you want to update and then through that call a method of that class like..
[sliderpage viewWillAppear:YES];
here silderpage is a object of menu page....
I hope may this help full to you....
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.