如何使用从另一个ViewController传递的数据更新UITableView?

时间:2016-10-23 09:01:16

标签: ios swift uitableview

我正在尝试使用用户登录后从UITableView传递给ViewController的数据填充LoginViewController

目前的流程是:

ViewController首先加载,如果用户未登录LoginViewController则弹出顶部。用户登录,详细信息从数据库中获取(userDetailscommunities)。然后LoginViewController被解雇,ViewController再次可见。

正在填充communities变量,并且值已从LoginViewController转移到ViewController

我相信我的问题是func tableView在从登录用户获取数据之前运行。

print ("test 1: ",communities)只打印[],[],[],[]

但是print ("test 2: ",communities)会打印正确的值。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UsernameSentDelegate {

@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var receiveUsername: UILabel!
@IBOutlet weak var userEmailText: UILabel!
var userEmail: String?
var communities = [String]()

@IBOutlet weak var communitiesTableView: UITableView!

@IBAction func unwindToHome(_ segue: UIStoryboardSegue) {


}


//recieves email address from delegate from LoginViewController
func userLoggedIn(data: String) {

  userEmailText.text = data
     }

override func viewDidLoad() {
    super.viewDidLoad()

    self.communitiesTableView.delegate = self
    self.communitiesTableView.dataSource = self

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print ("test 1: ",communities) //not printing value 
    return self.communities.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let title = self.communities[indexPath.row]

    let cell = UITableViewCell()

    cell.textLabel?.text = title

    return cell

}


override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if segue.identifier == "loginView" {
        let loginViewController: LoginViewController = segue.destination as! LoginViewController
        loginViewController.delegate = self
    }

    if segue.identifier == "createCommunitySegue" {
        let createCommunityController: CreateNewCommunity = segue.destination as! CreateNewCommunity
        createCommunityController.myEmail = userEmailText.text
    }


}


override func viewDidAppear(_ animated: Bool)
{
    print ("test 2: ",communities) //prints values correctly
   let isUserLoggedIn = UserDefaults.bool(UserDefaults.standard)(forKey: "isUserLoggedIn");

    if(!isUserLoggedIn)
    {
        self.performSegue(withIdentifier: "loginView", sender: self);
    }

}


@IBAction func logoutButtonTapped(_ sender: AnyObject) {

    UserDefaults.set(UserDefaults.standard)(false, forKey: "isUserLoggedIn");
    self.performSegue(withIdentifier: "loginView", sender: self);

}


@IBAction func createCommunityTapped(_ sender: AnyObject) {


}


}

这是CreateCommunityViewController的代码:

import UIKit

class CreateNewCommunity: UIViewController {

@IBOutlet weak var communityNameTextField: UITextField!
@IBOutlet weak var passwordTextField: UILabel!
@IBOutlet weak var emailLabel: UILabel!

var myEmail: String?


@IBAction func cancelButtonPapped(_ sender: AnyObject) {

    self.performSegue(withIdentifier: "unwindCommunity", sender: self)
}

@IBAction func createCommunityButtonTapped(_ sender: AnyObject) {

    let communityName = communityNameTextField.text;
    if (communityName!.isEmpty){
        displayMyAlertMessage(userMessage: "You must name your Community");

        return;
    }else{

        func generateRandomStringWithLength(length: Int) -> String {

            var randomString = ""
            let letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

            for _ in 1...length {
                let randomIndex  = Int(arc4random_uniform(UInt32(letters.characters.count)))
                let a = letters.index(letters.startIndex, offsetBy: randomIndex)
                randomString +=  String(letters[a])
            }

            return randomString
        }

        let communityCode = generateRandomStringWithLength(length: 6)
        passwordTextField.text = communityCode

        let myUrl = URL(string: "http://www.quasisquest.uk/KeepScore/createCommunity.php?");

        var request = URLRequest(url:myUrl!);
        request.httpMethod = "POST";

        let postString = "communityname=\(communityName!)&code=\(communityCode)&email=\(myEmail!)";

        request.httpBody = postString.data(using: String.Encoding.utf8);

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            DispatchQueue.main.async
                {

        if (try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]) != nil {

            let myAlert = UIAlertController(title: "Community Registered", message: "Community Code:\(communityCode)", preferredStyle: UIAlertControllerStyle.alert);


            let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default){(action) in
                self.dismiss(animated: true, completion: nil)

            }

            myAlert.addAction(okAction);
            self.present(myAlert, animated: true, completion: nil)

            }

        }
        }
        task.resume()


    }

}

}

1 个答案:

答案 0 :(得分:0)

尝试在didSet中调用重载数据。例如。 var communities = [] { didSet { yourtableview.realoadData() } }