Я пытаюсь интегрировать представление закладок Pinboard (путем разбора RSS-канала и отображения его в UITableView
) в моем приложении-браузере, и я сталкиваюсь с несколькими проблемами. Вы можете увидеть мои предыдущие вопросы here и here. Я пытаюсь использовать переменные, которые я собрал у своего пользователя в Alert, чтобы получить секретный токен RSS-канала пользователя. Однако, когда я запускаю приложение, это вызывает сбой с ошибкой «EXC_BAD_INSTRUCTION» со следующей консоли вывода:Как разобрать RSS-канал, используя NSXMLParser с переменными в адресе канала, нажав кнопку в предупреждении UIAlertController в Swift?
fatal error: unexpectedly found nil while unwrapping an Optional value
Я проверил все, но я не могу найти nil
.
Это код, я использую:
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)
}
Ошибка в let url: NSURL = ...
строке функции синтаксического анализатора.
Что я делаю неправильно?
Хорошая точка! :-) – zisoft
Привет @Rob, это действительно хороший момент. Однако, даже когда я развожу опцию с помощью! он все еще не работает. Я использую API-интерфейс Pinboard, как указано [здесь] (https://pinboard.in/api), который должен только возвращать секрет в имени элемента результата: '$ curl https://api.pinboard.in/v1 ?/пользователь/тайна/auth_token = пользователь: ЗНАК XML версия = "1.0" кодирование = "UTF-8"> 6493a84f72d86e7de130 ', Как я могу быть уверен, что он получил это правильно? Когда я переключаю переменную с самим токеном, он работает с curl, но он не будет работать с Xcode и кодом. –
PastaCoder
В дополнение к моему предыдущему комментарию, я думаю, что это что-то с eName (поскольку оно работает с curl на терминале, а не в коде), но я не уверен, что ... – PastaCoder