选择一个TableViewCell为Swift中的indexPathForSelectedRow()?. row提供零 [英] Selecting a TableViewCell provides nil for indexPathForSelectedRow()?.row in Swift

查看:96
本文介绍了选择一个TableViewCell为Swift中的indexPathForSelectedRow()?. row提供零的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图在浏览器应用程序中集成Pinboard书签视图(通过解析RSS Feed并在TableView中显示它),但是遇到了一些问题,主要的问题是选择单元格总是返回nil并导致崩溃.

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, the main one is that selecting a cell always returns nil and causes a crash.

我遵循了本指南来创建视图.

将提要加载到BlogReader完整项目中可以很好地工作,但是在我自己的项目中使用提要始终在最后prepareForSegue函数的indexPathForSelectedRow中返回nil.

Loading the feed in the BlogReader complete project works perfectly, but using it on my own project always returns nil in indexPathForSelectedRow in the prepareForSegue function on the end.

由于我的应用是浏览器,因此我的Storyboard的设置与BlogReader上的设置不同.我有一个包含WKWebView和UIButton的主ViewController,点击该按钮可以对BookmarksViewController进行显示,其中有一个容器,其中包含一个嵌入BookmarksTableViewController的容器-TableView. BookmarksTableViewController在主ViewController上有一个显示标识符为"viewbookmark"的节目.

Since my app is a browser, my Storyboard is set differently than the one on the BlogReader one. I have the main ViewController that includes a WKWebView and a UIButton, tapping the button performs a show segue to BookmarksViewController which has a container with an embed segue to BookmarksTableViewController - the TableView. BookmarksTableViewController has a show segue with the identifier "viewbookmark" to the main 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

PastaCoder

推荐答案

tableView.deselectRowAtIndexPath(indexPath, animated: true)

您刚刚在

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

这篇关于选择一个TableViewCell为Swift中的indexPathForSelectedRow()?. row提供零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆