根据输入从服务器端检索数据

时间:2017-03-30 22:02:22

标签: ios json swift

我正在做一个学校项目,它的多个表和tabBarControllers。现在,我想根据选定的行显示从服务器端返回的数据。我设法将选定的行从View传递到另一个,我相信将它传递到服务器端也没有错。问题是从服务器检索数据时。

这是课程视图

    // This array is to hold data coming from server side
var course: NSArray = []

// Assign data that come from DepartmentView
public var department: String? = nil

var myURL = URL(string: "http://localhost/masterProject/scripts/courses.php")

override func viewDidLoad()
{
    super.viewDidLoad()

    self.title = "Courses"
}

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    // This is just to make sure it gets data and not nil
    let vDepartment = department!

    // Create a request
    var request = URLRequest(url: myURL!)
    request.httpMethod = "POST";

    // Create a parameter to be sent to server side and based on this
    // data I want to get data back that belong to it.
    let postParameter = "department=\(vDepartment)";

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

    // Here I Create and send dataTask
    let task = URLSession.shared.dataTask(with: request)
    { (data: Data?, response: URLResponse?, error: Error?) in

        DispatchQueue.main.async
        {
            if(error != nil)
            {
                self.alertMessage(message: (error?.localizedDescription)!)
                return
            }

           // This is supposed to read data from server side and display it
           // in Course table view.
            self.course = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSArray
        }
    }
    task.resume()
}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return course.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "courseCell", for: indexPath) as! CourseTableViewCell
    let main = course[indexPath.row] as! NSDictionary

    cell.courseName.text = (main["name"] as! String)
    cell.courseNumber.text = (main["number"] as! String)


    return cell
}

func alertMessage(message: String)
{
    let alert = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
    let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
    alert.addAction(action)
    self.present(alert, animated: true, completion: nil)
}

部门视图

  var departments: NSArray = []
var myURL = URL(string: "http://localhost/masterProject/scripts/department.php")


override func viewDidLoad()
{
    super.viewDidLoad()
}

override func viewWillAppear(_ animated: Bool)
{
    self.title = "Departments"

    super.viewWillAppear(animated)
    let data = NSData(contentsOf: myURL!)

    departments = try! JSONSerialization.jsonObject(with: data! as Data, options: .mutableContainers) as! NSArray
}


// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    // #warning Incomplete implementation, return the number of rows
    return departments.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    let data = departments[indexPath.row] as! NSDictionary
    cell.textLabel?.text = (data["name"] as! String)

    return cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if segue.identifier == "showDepCourses"
    {
        if let indexPath = tableView.indexPathForSelectedRow
        {
            let courseVC = segue.destination as! CourseTableViewController
            let data = departments[indexPath.row] as! NSDictionary
            courseVC.department = (data["name"] as! String)
        }
    }
}

}

以下是两个视图的图片

department view

course view

我应该根据选定的行获取正确的数据,但不会显示任何内容。

1 个答案:

答案 0 :(得分:0)

self.tabeView.reloadData()一直缺失。

这是问题的答案:

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)

    // Just to make sure "Optional" keyword not send as POST PERAMETER
    let selectedDep = department!

    // Create a request
    var request = URLRequest(url: myURL!)
    request.httpMethod = "POST";

    // Create a parameter to be sent to server side and based on this
    // data I want to get data back that belong to it.
    let postParameter = "department=\(selectedDep)";

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

    // Here I create and send dataTask
    let task = URLSession.shared.dataTask(with: request)
    { (data: Data?, response: URLResponse?, error: Error?) in

        DispatchQueue.main.async
            {
                if(error != nil)
                {
                    self.alertMessage(message: (error?.localizedDescription)!)
                    return
                }

                // This is supposed to read data from server side and display it
                // in Course table view.
                self.courses = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSArray
                self.tableView.reloadData()
        }
    }
    task.resume()
}