将数据从 TableViewController 传递到解析器

Passing data from TableViewController to parser

在我的应用程序开发过程中,我遇到了一个具体问题。 我有一个包含以下列的数据库:Dossier_Title、Dossier_Name、Dossier_Category 和 Dossier_Description。每个 Dossier 的描述都是唯一的。

  1. 首先,我调用我的 WebService,它选择唯一的 Dossier_Title 并形成一个 xml 页面。在该应用程序解析此页面并在 table 视图中形成许多独特的单元格之后。它还形成一个由 Dossier_Title 和 Dossier_category.
  2. 组成的数组
  3. 现在我想形成一个新的 tableView,它包含 Dossier_Name 和 Dossier_Description,基于我在上一步中实现的 Dossier_Category。为此,我想调用一个新的 WebService 并使用该类别作为条件对其进行解析。

我的问题是:如何将 Dossier_category 传递给我的第二个解析器以便将其用作条件? 这是我的第一个解析器代码,我假设第二个解析器代码与添加一些新条件后几乎相同

class DossierParser: NSObject, NSXMLParserDelegate {


    var parser = NSXMLParser()
    var feeds = NSMutableArray()
    var elements = NSMutableDictionary()
    var element = NSString()
    var ftitle = NSMutableString()
    var link = NSMutableString()
    var fdescription = NSMutableString()
    var fdate = NSMutableString()
    var fcategory = NSMutableString()

    // initilise parser
    /*
    func initWithURL(url :NSURL) -> AnyObject {
    startParse(url)
    return self
    }
    */
    init(URL: NSURL){
        super.init()
        startParse(URL)
    }



    func startParse(url :NSURL) {
        feeds = []
        parser = NSXMLParser(contentsOfURL: url)!
        parser.delegate = self
        parser.shouldProcessNamespaces = false
        parser.shouldReportNamespacePrefixes = false
        parser.shouldResolveExternalEntities = false
        parser.parse()
    }

    func allFeeds() -> NSMutableArray {
        return feeds
    }
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

        self.element = elementName

        if self.element == "News" {
            elements = NSMutableDictionary()
            elements = [:]
            ftitle = NSMutableString()
            ftitle = ""
            fdescription = NSMutableString()
            fdescription = ""
            fdate = NSMutableString()
            fdate = ""
            fcategory = NSMutableString()
            fcategory = ""

        }
    }

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

        if (elementName as NSString).isEqualToString("News") {
            if ftitle != "" {
                elements.setObject(ftitle, forKey: "DosNum")
            }
            if fcategory != "" {
                elements.setObject(fcategory, forKey: "Dossier_number")
            }




            if fdate != "" {
                elements.setObject(fdate, forKey: "Date_Text")
            }

            feeds.addObject(elements)
        }

    }
    func parser(parser: NSXMLParser, foundCharacters string: String?) {

        if element.isEqualToString("DosNum") {
            ftitle.appendString(string!)

        }else if element.isEqualToString("Date_Text") {
            fdate.appendString(string!)

        }else if element.isEqualToString("Dossier_number"){
            fcategory.appendString(string!)
        }

    }

这是我的第一个 TableView 代码。

var myFeed : NSArray = []
var url: NSURL = NSURL()

override func viewDidLoad() {
    super.viewDidLoad()

    // Cell height.
    self.tableView.rowHeight = 70
    self.tableView.dataSource = self
    self.tableView.delegate = self

    //url = NSURL(string: "https://www.kpmg.com/_layouts/feed.aspx?xsl=1&web=/RU/ru/IssuesAndInsights/RSSFeeds&page=207b36b2-20f7-407f-a9ec-a09f191fd84b&wp=9810a349-6086-489d-ad03-40c06f6669f6")!
    //url = NSURL(string: "http://www.skysports.com/rss/0,20514,11661,00.xml")!
    // url = NSURL(scheme: "https", host: "www.kpmg.com", path: "/_layouts/feed.aspx?xsl=1&web=/RU/ru/IssuesAndInsights/RSSFeeds&page=207b36b2-20f7-407f-a9ec-a09f191fd84b&wp=9810a349-6086-489d-ad03-40c06f6669f6")!
    //(scheme: "http", host: "10.207.203.216", path: "/AppWebservice/Service1.asmx/getNewsData")!
    url = NSURL(string: "http://10.207.206.74/AppWebservice/Service1.asmx/getUniqDossier")!
    // Call custom function.
    loadRss(url);

}

override func viewWillAppear(animated: Bool) {


    super.viewWillAppear(animated)

    self.navigationItem.title = ""


    let backImg:UIImage! = UIImage(named: "backPicture.png")


    self.navigationItem.backBarButtonItem =
        UIBarButtonItem(image:backImg, style:.Plain, target:self, action:nil);

    let navBgImage:UIImage = UIImage(named: "express.png")!
    self.navigationController?.navigationBar.setBackgroundImage(navBgImage, forBarMetrics: .Default)
}


func loadRss(data: NSURL) {


    let myParser = DossierParser(URL: data)

    myFeed = myParser.feeds

    tableView.reloadData()
}



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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {



    if segue.identifier == "openPage" {

        let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow!
        let selectedFTitle: String = myFeed[indexPath.row].objectForKey("DosNum") as! String
        let selectedFContent: String = myFeed[indexPath.row].objectForKey("Dossier_number") as! String
        // Instance of our feedpageviewcontrolelr
        let fpvc: FeedPageViewController = segue.destinationViewController as! FeedPageViewController
        fpvc.selectedFeedTitle = selectedFTitle
        fpvc.selectedFeedFeedContent = selectedFContent
    }
}


// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

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


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let chevron = UIImage(named: "Next4.png")
    cell.accessoryType = .DisclosureIndicator
    cell.accessoryView = UIImageView(image: chevron!)
    cell.textLabel?.textColor = UIColor.blackColor()
    // Feeds dictionary.
    var dict : NSDictionary! = myFeed.objectAtIndex(indexPath.row) as! NSDictionary

    // Set cell properties.
    cell.textLabel?.text = myFeed.objectAtIndex(indexPath.row).objectForKey("DosNum") as? String







    cell.detailTextLabel?.text = myFeed.objectAtIndex(indexPath.row).objectForKey("Date_text") as? String

    return cell

}

如有任何帮助,我将不胜感激。我猜应该有更简单的解决方法,但我不知道,所以如果有人有建议那就太好了!

谢谢!

我相信您会希望保留 fCategory 的实例并将其通过 init 传递给第二个解析器 class。

第二个解析器 class 应具有以下内容以允许传入 fcategory 并在本地存储以供解析器使用。

let fcategory = NSMutableString()
let URL = NSURL

init(URL: NSURL, category: String){
    super.init()

    self.URL = URL
    self.fcategory = category

    self.startParse(URL, fcategory)
}