2016-10-02 1 views
0

저는 PickerView와 TableView를 표시하는 iOS 응용 프로그램을 만들려고합니다. PickerView는 미국 50 개 주를 포함하며 TableView는 National Weather Service가 제공하는 XML을 기반으로 선택된 주에 대한 현재 기상 알림을 표시합니다. XML에 대한 URL은 플로리다의 경우 https://alerts.weather.gov/cap/fl.php?x=0, 캘리포니아의 경우 https://alerts.weather.gov/cap/ca.php?x=0입니다. 즉, 각 상태의 XML에 대한 URL은 두 문자로 된 상태 약어에 따라 다릅니다.PickView에서 현재 선택을 기반으로 한 TableView 표시 값을 만드시겠습니까?

지금까지 필자는 PickerView에서 50 개 주를 모두 올바르게 표시하고 각 주를 선택하면 해당 주에 대한 기상 알림이 실제로 TableView에 표시됩니다. 그러나 일단 TableView에 날씨 경고가 입력되면 그 후에는 절대로 사라지지 않습니다. 나는 TableView를 으로 만 지정하기를 원합니다.은 현재 PickerView에서 선택된 상태에 대한 경고를 보여줍니다. 지금 현재 각 주에 대한 날씨 알림은 TableView에 계속 추가됩니다. 또한 이전에 선택한 상태로 돌아 가면 날씨 알림이 TableView 끝에 중복으로 다시 추가됩니다. 한 번에 각 개별 상태에 대한 경고 만 표시하도록 TableView를 올바르게 채우는 방법을 모르겠습니다. 누구든지 나를 도울 수 있습니까? 당신은 지속적으로 alertsexps 결코 그들을 다시 초기화에 추가된다

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

:

여기 내 코드입니다. 당신이 alerts & exps 배열의 끝으로 웹 요청의 결과를 추가하는 것 같습니다 코드에서

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

: pickerView(_:didSelectRow:inComponent)에서

, 새로운 입력을 구문 분석하기 전에 빈 다시 alertsexps을 설정 alerts.append(string), exps.append(string)을 통해

append-ing 대신 배열을 먼저 지운 다음 결과를 추가해야합니다.

관련 문제