dimanche 26 avril 2015

How to parse a RSS feed using NSXMLParser with variables on the feed address by pressing a button in a UIAlertController Alert in Swift?


I have been trying to integrate a Pinboard bookmarks view (by parsing an RSS Feed and displaying it in a TableView) in my browser app, and I'm encountering a few issues. You can see my previous questions here and here. I'm trying to use the variables I collected from my user in the Alert, to get the user's secret RSS feed token. However when I run the app, it causes a crash with a error of "EXC_BAD_INSTRUCTION" with the following console output:

fatal error: unexpectedly found nil while unwrapping an Optional value

I checked everything but I can't find a nil.

This is the code I'm using:

class SettingsTableViewController: UITableViewController, MFMailComposeViewControllerDelegate, NSXMLParserDelegate {

var _pinboardUsername: String?
var _pinboardAPIToken: String?

var parser: NSXMLParser = NSXMLParser()
var bookmarks: [Bookmark] = []
var pinboardSecret: String = String()
var eName: String = String()

...

    @IBAction func pinboardUserDetailsRequestAlert(sender: AnyObject) {
    //Create the AlertController
    var pinboardUsernameField :UITextField?
    var pinboardAPITokenField :UITextField?
    let pinboardUserDetailsSheetController: UIAlertController = UIAlertController(title: "Pinboard Details", message: "Please enter your Pinboard Username and API Token to access your bookmarks", preferredStyle: .Alert)
    //Add a text field
    pinboardUserDetailsSheetController.addTextFieldWithConfigurationHandler({(usernameField: UITextField!) in
        usernameField.placeholder = "Username"
        usernameField.text = self._pinboardUsername
        var parent = self.presentingViewController as! ViewController
        pinboardUsernameField = usernameField

    })
    pinboardUserDetailsSheetController.addTextFieldWithConfigurationHandler({(apiTokenField: UITextField!) in
        apiTokenField.placeholder = "API Token"
        apiTokenField.text = self._pinboardAPIToken
        var parent = self.presentingViewController as! ViewController
        pinboardAPITokenField = apiTokenField

    })
    pinboardUserDetailsSheetController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
    pinboardUserDetailsSheetController.addAction(UIAlertAction(title: "Done", style: .Default, handler: { (action) -> Void in
        // Now do whatever you want with inputTextField (remember to unwrap the optional)
        var valueUser = pinboardUsernameField?.text
        NSUserDefaults.standardUserDefaults().setValue(valueUser, forKey: AppDefaultKeys.PinboardUsername.rawValue)
        var valueAPI = pinboardAPITokenField?.text
        NSUserDefaults.standardUserDefaults().setValue(valueAPI, forKey: AppDefaultKeys.PinboardAPIToken.rawValue)
        let url:NSURL = NSURL(string: "http://ift.tt/1Otda4l")!
        self.parser = NSXMLParser(contentsOfURL: url)!
        self.parser.delegate = self
        self.parser.parse()

        func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
            self.eName = elementName
            if elementName == "result" {
                self.pinboardSecret = String()
                NSUserDefaults.standardUserDefaults().setValue(self.pinboardSecret, forKey: AppDefaultKeys.PinboardSecret.rawValue)
            }
        }
    }))
    self.presentViewController(pinboardUserDetailsSheetController, animated: true, completion: nil)   
}

The error is in the let url line of the parser function.

What am I doing wrong?

Thanks,

PastaCoder


Aucun commentaire:

Enregistrer un commentaire