简体   繁体   中英

iWhy my table view is nil when i called from another view controller?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM