Swift:将数据从UITableView发送到UIViewController

时间:2015-09-07 20:08:56

标签: ios swift uitableview uiviewcontroller

我在TableView中有一个城市列表,并希望将数据从TableView中的单元格传递给UIViewController。现在,当我传递数据时,我还想将这些城市的纬度和经度传递给UIViewController。这是TableViewController代码。

class MasterTableViewController: UITableViewController
{
    let fruits = ["London", "Melbourne", "Singapore", "Brazil", "Germany", "Monza", "Dallas", "Auckland", "Brussels", "Shanghai", "Sepang", "Barcelona"]

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

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Segues

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showDetail" {
            if let indexPath = self.tableView.indexPathForSelectedRow() {
                let fruit = fruits[indexPath.row]

                (segue.destinationViewController as! ViewController).detailItem = fruit
            }
        }
    }

    // MARK: - Table View

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fruits.count
    }
    override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        if (indexPath.row == 0){
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

        let fruit = fruits[indexPath.row]
        cell.textLabel!.text = fruit
        return cell
    }

    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }
}

我可以通过城市,但你如何将城市经度的纬度传递给UIViewController。以下是UIViewController的代码。

class ViewController: UIViewController {
    @IBOutlet weak var currentTemperatureLabel: UILabel?
    @IBOutlet weak var currentHumidityLabel: UILabel?
    @IBOutlet weak var currentPrecipitationLabel: UILabel?
    @IBOutlet weak var currentWeatherIcon: UIImageView?
    @IBOutlet weak var currentWeatherSummary: UILabel?
    @IBOutlet weak var refreshButton: UIButton?
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView?
    @IBOutlet weak var detailDescriptionLabel: UILabel?

    // Location coordinates
    let coordinate: (lat: Double, lon: Double) = (37.8267,-122.423)

    // TODO: Enter your API key here
    private let forecastAPIKey = ""

    var detailItem: AnyObject? {
        didSet {
            // Update the view.
            self.configureView()
        }
    }

    func configureView() {
        if let detail: AnyObject = self.detailItem {
            if let label = self.detailDescriptionLabel {
            label.text = detail.description
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.configureView()
        retrieveWeatherForecast()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func retrieveWeatherForecast() {
        let forecastService = ForecastService(APIKey: forecastAPIKey)
        forecastService.getForecast(coordinate.lat, lon: coordinate.lon) {
            (let currently) in

            if let currentWeather = currently {

                dispatch_async(dispatch_get_main_queue()) {

                    if let temperature = currentWeather.temperature {
                        self.currentTemperatureLabel?.text = "\(temperature)º"
                    }

                    if let humidity = currentWeather.humidity {
                        self.currentHumidityLabel?.text = "\(humidity)%"
                    }

                    if let precipitation = currentWeather.precipProbability {
                        self.currentPrecipitationLabel?.text = "\(precipitation)%"
                    }

                    if let icon = currentWeather.icon {
                        self.currentWeatherIcon?.image = icon
                    }

                    if let summary = currentWeather.summary {
                        self.currentWeatherSummary?.text = summary
                    }

                    self.toggleRefreshAnimation(false)

                }

            }
        }
    }

    @IBAction func refreshWeather() {
        toggleRefreshAnimation(true)
        retrieveWeatherForecast()
    }

    func toggleRefreshAnimation(on: Bool) {
        refreshButton?.hidden = on
        if on {
            activityIndicator?.startAnimating()
        } else {
            activityIndicator?.stopAnimating()
        }
    }
}

1 个答案:

答案 0 :(得分:0)

将位置的属性添加到ViewController

然后,您可以在MasterTableViewController prepareForSegue中传递该城市的位置,类似于您现在通过城市(detailItem)的方式。

<强>更新

要传递其他参数,您可以将其添加到ViewController

var coordinateItem: AnyObject? {
    didSet {
        // Update the view.
        self.configureView()
    }
}

然后在prepareForSegue

中传递它
(segue.destinationViewController as! ViewController).coordinateItem = location

更新2:

是的,您可以初始化坐标数组,并传递纬度和经度坐标。

var locations : [[Double]] = [[51.50722, -0.12750], [-37.8136, 144.9631], ...]

在这种情况下,您的coordinateItem将是[Double]

您可以coordinateItem[0]coordinateItem[1]

访问这两个双打

无论您是否传递数组或字符串,一般概念都是相同的。