选择一个 TableViewCell 为 indexPathForSelectedRow()?.row in Swift 提供 nil
Selecting a TableViewCell provides nil for indexPathForSelectedRow()?.row in Swift
我一直在尝试在我的浏览器应用程序中集成 Pinboard 书签视图(通过解析 RSS Feed 并将其显示在 TableView 中),但我遇到了一些问题,主要问题是选择单元格总是 returns nil 并导致崩溃。
我按照 this guide 创建了视图。
在 BlogReader 完整项目中加载提要完美无缺,但在我自己的项目中使用它总是 returns 最后在 prepareForSegue 函数中的 indexPathForSelectedRow 中为 nil。
因为我的应用程序是一个浏览器,所以我的 Storyboard 设置与 BlogReader 上的不同。我有一个包含 WKWebView 和 UIButton 的主 ViewController,点击按钮会执行到 BookmarksViewController 的显示转场,它有一个容器,其中有一个嵌入到 BookmarksTableViewController - TableView 的转场。 BookmarksTableViewController 有一个带有标识符 "viewbookmark" 的 show segue 到主 ViewController.
这是我使用的代码:
import UIKit
class BookmarksTableViewController: UITableViewController, NSXMLParserDelegate {
var parser: NSXMLParser = NSXMLParser()
var bookmarks: [Bookmark] = []
var bookmarkTitle: String = String()
var bookmarkLink: String = String()
var eName: String = String()
override func viewDidLoad() {
super.viewDidLoad()
let url:NSURL = NSURL(string: "http://feeds.pinboard.in/rss/secret:XXX/u:XXXX/")!
parser = NSXMLParser(contentsOfURL: url)!
parser.delegate = self
parser.parse()
}
// MARK: - NSXMLParserDelegate methods
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
eName = elementName
if elementName == "item" {
bookmarkTitle = String()
bookmarkLink = String()
}
}
func parser(parser: NSXMLParser, foundCharacters string: String?) {
let data = string!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
if (!data.isEmpty) {
if eName == "title" {
bookmarkTitle += data
} else if eName == "link" {
bookmarkLink += data
}
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "item" {
let bookmarkItem: Bookmark = Bookmark()
bookmarkItem.bookmarkTitle = bookmarkTitle
bookmarkItem.bookmarkLink = bookmarkLink
bookmarks.append(bookmarkItem)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return bookmarks.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
let bookmarkItem: Bookmark = bookmarks[indexPath.row]
cell.textLabel?.text = bookmarkItem.bookmarkTitle
return cell
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 50.0
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
// get to the next screen
self.performSegueWithIdentifier("viewbookmark", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "viewbookmark" {
let selectedRow = tableView.indexPathForSelectedRow()?.row
let bookmarkItem: Bookmark = bookmarks[selectedRow!]
let viewController = segue.destinationViewController as! ViewController
viewController._bookmarkLink = bookmarkItem.bookmarkLink
let url: NSURL = NSURL(string: bookmarkItem.bookmarkLink)!
let request: NSURLRequest = NSURLRequest(URL: url)
viewController._webView!.loadRequest(request)
}
}
}
我做错了什么?
谢谢,
PastaCoder
tableView.deselectRowAtIndexPath(indexPath, animated: true)
您刚刚在
中取消了选择
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
我一直在尝试在我的浏览器应用程序中集成 Pinboard 书签视图(通过解析 RSS Feed 并将其显示在 TableView 中),但我遇到了一些问题,主要问题是选择单元格总是 returns nil 并导致崩溃。
我按照 this guide 创建了视图。
在 BlogReader 完整项目中加载提要完美无缺,但在我自己的项目中使用它总是 returns 最后在 prepareForSegue 函数中的 indexPathForSelectedRow 中为 nil。
因为我的应用程序是一个浏览器,所以我的 Storyboard 设置与 BlogReader 上的不同。我有一个包含 WKWebView 和 UIButton 的主 ViewController,点击按钮会执行到 BookmarksViewController 的显示转场,它有一个容器,其中有一个嵌入到 BookmarksTableViewController - TableView 的转场。 BookmarksTableViewController 有一个带有标识符 "viewbookmark" 的 show segue 到主 ViewController.
这是我使用的代码:
import UIKit
class BookmarksTableViewController: UITableViewController, NSXMLParserDelegate {
var parser: NSXMLParser = NSXMLParser()
var bookmarks: [Bookmark] = []
var bookmarkTitle: String = String()
var bookmarkLink: String = String()
var eName: String = String()
override func viewDidLoad() {
super.viewDidLoad()
let url:NSURL = NSURL(string: "http://feeds.pinboard.in/rss/secret:XXX/u:XXXX/")!
parser = NSXMLParser(contentsOfURL: url)!
parser.delegate = self
parser.parse()
}
// MARK: - NSXMLParserDelegate methods
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
eName = elementName
if elementName == "item" {
bookmarkTitle = String()
bookmarkLink = String()
}
}
func parser(parser: NSXMLParser, foundCharacters string: String?) {
let data = string!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
if (!data.isEmpty) {
if eName == "title" {
bookmarkTitle += data
} else if eName == "link" {
bookmarkLink += data
}
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "item" {
let bookmarkItem: Bookmark = Bookmark()
bookmarkItem.bookmarkTitle = bookmarkTitle
bookmarkItem.bookmarkLink = bookmarkLink
bookmarks.append(bookmarkItem)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return bookmarks.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
let bookmarkItem: Bookmark = bookmarks[indexPath.row]
cell.textLabel?.text = bookmarkItem.bookmarkTitle
return cell
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 50.0
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
// get to the next screen
self.performSegueWithIdentifier("viewbookmark", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "viewbookmark" {
let selectedRow = tableView.indexPathForSelectedRow()?.row
let bookmarkItem: Bookmark = bookmarks[selectedRow!]
let viewController = segue.destinationViewController as! ViewController
viewController._bookmarkLink = bookmarkItem.bookmarkLink
let url: NSURL = NSURL(string: bookmarkItem.bookmarkLink)!
let request: NSURLRequest = NSURLRequest(URL: url)
viewController._webView!.loadRequest(request)
}
}
}
我做错了什么?
谢谢,
PastaCoder
tableView.deselectRowAtIndexPath(indexPath, animated: true)
您刚刚在
中取消了选择override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {