2016-10-02 80 views
0

我试图做一个显示PickerView和TableView的iOS应用程序。 PickerView包含美国的50个州,并且TableView应该根据国家气象部门提供的XML显示当前所选状态的天气警报。 XML的URL是佛罗里达州的https://alerts.weather.gov/cap/fl.php?x=0,加利福尼亚州的https://alerts.weather.gov/cap/ca.php?x=0等。换句话说,每个州的XML的URL基于双字母状态缩写而变化。根据PickerView中的当前选择制作一个TableView显示值?

到目前为止,我已经得到了应用程序正确地显示所有在PickerView 50个州,并选择每个状态时,该州的天气警报确实出现在TableView中。但是,一旦TableView被填充了天气警报,它们就不会在此之后消失。我希望TableView到只有显示PickerView中当前所选状态的警报。截至目前,每种状态的天气警报只是不断添加到TableView上。另外,如果我回到之前选择的状态,天气警报将作为重复项再次添加到TableView的末尾。我不知道如何使TableView正确填充,以便它一次只显示每个单独状态的警报。谁能帮我吗?

这里是我的代码:

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITableViewDataSource, UITableViewDelegate, XMLParserDelegate { 

    @IBOutlet var statePicker: UIPickerView! 
    @IBOutlet var alertsTable: UITableView! 


    var titleFound:Bool = false 
    var descFound:Bool = false 
    var alerts:[String] = [] 
    var exps:[String] = [] 
    var abbv:String = "" 
    var parser = XMLParser() 
    var states = ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"] 
    var abbvsList = ["al", "ak", "az", "ar", "ca", "co", "ct", "de", "fl", "ga", "hi", "id", "il", "in", "io", "ks", "ky", "la", "me", "md", "ma", "mi", "mn", "ms", "mo", "mt", "ne", "nv", "nh", "nj", "nm", "ny", "nc", "nd", "oh", "ok", "or", "pa", "ri", "sc", "sd", "tn", "tx", "ut", "vt", "va", "wa", "wv", "wi", "wy"] 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int)->Int 
    { 
     return states.count 
    } 

    func pickerView(_ pickerView:UIPickerView, titleForRow row: Int, forComponent component: Int)->String? 
    { 
     return states[row] 
    } 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(_ pickerView:UIPickerView, didSelectRow row:Int, inComponent component:Int) 
    { 
     var currentState = abbvsList[statePicker.selectedRow(inComponent: 0)] 
     parser = XMLParser(contentsOf:(NSURL(string:"http://alerts.weather.gov/cap/\(currentState).php?x=0") as! URL))! 
     parser.delegate = self 
     parser.parse() 
     alertsTable.reloadData() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     statePicker.delegate = self 
     statePicker.dataSource = self 
     self.alertsTable.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 
     alertsTable.delegate = self 
     alertsTable.dataSource = self 
    } 

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { 
     if(elementName == "cap:event") { 
      titleFound = true 
     } 
     if(elementName == "cap:expires") { 
      descFound = true 
     } 
    } 

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
     if(elementName == "cap:event") { 
      titleFound = false 
     } 
     if(elementName == "cap:expires") { 
      descFound = false 
     } 
    } 

    func parser(_ parser: XMLParser, foundCharacters string: String) { 
     if(titleFound) { 
      alerts.append(string) 
     } 
     if(descFound) { 
      exps.append(string) 
     } 
    } 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell:UITableViewCell = UITableViewCell(style:UITableViewCellStyle.subtitle, reuseIdentifier: "cell") 
     cell.textLabel!.text = alerts[indexPath.row] 
     cell.detailTextLabel!.text = "Expires: "+exps[indexPath.row] 
     return cell 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     //What happens when the cell is tapped` 
    } 
} 

回答

0

你不断追加到alertsexps,从不重新初始化它们。

pickerView(_:didSelectRow:inComponent),设置alertsexps回空解析新的输入前:

func pickerView(_ pickerView:UIPickerView, didSelectRow row:Int, inComponent component:Int) 
{ 
    var currentState = abbvsList[statePicker.selectedRow(inComponent: 0)] 
    parser = XMLParser(contentsOf:(NSURL(string:"http://alerts.weather.gov/cap/\(currentState).php?x=0") as! URL))! 

    alerts = [] 
    exps = [] 

    parser.delegate = self 
    parser.parse() 
    alertsTable.reloadData() 
} 
+0

啊,我知道它是什么次要的那样。我一直盯着代码这么久才开始变得模糊-_-非常感谢你! –

0

从它看起来像您要添加的Web请求的结果alerts & exps阵列结束代码通过alerts.append(string)exps.append(string)

代替append -ing,您需要首先清除数组,然后添加的结果。

相关问题