![](/img/trans.png)
[英]Found Nil Error when reload table view from another view controller swift
[英]iWhy my table view is nil when i called from another view controller?
我試圖在用戶注銷時通過將表視圖中的標簽設置為“僅成員”從左菜單(滑出)重新加載表視圖控制器。因此,我將其稱為refreshAuctionLatestViewController.viewWillAppear(true)。但是,該表認為將在該方法中重新加載的視圖為nil。有幫助嗎?
這是我的幻燈片菜單控制器(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
}
這是我的控制台輸出,您將在下面看到nil。
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
有任何想法嗎?有任何建議嗎?
要更新該菜單,您必須調用已采用該表格視圖的該類的方法,並為此做一件事,將該類的對象創建到要更新的其他類中,然后通過該方法進行調用該類的..
[sliderpage viewWillAppear:YES];
這里silderpage是菜單頁面的對象。
希望對您有幫助。...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.