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