I have been trying to integrate a Pinboard bookmarks view (by parsing an RSS Feed and displaying it in a UITableView
) 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: "https://api.pinboard.in/v1/user/secret/?auth_token=\(valueAPI)")!
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: NSURL = ...
line of the parser function.
What am I doing wrong?