对象未在NavigationController

时间:2015-05-31 22:57:20

标签: swift uinavigationcontroller

我遇到了一个令我困惑的问题。我正在将一个项目从Objective-C转换为Swift,并且是第一次使用故事板。该应用程序下载RSS数据并将标题,链接和pubDate存储在CoreData中的Article对象中。当用户单击某行时,它会在webView中加载文章。

我遇到的问题与将Article对象传递给webView有关。我可以使用放在tableViewCell上的按钮传递它,但选择单元格会导致应用程序崩溃,并且它表示传递给webView的文章对象为零。但是,如果我在使用println()传递之前对其进行测试,则表明它不是nil。

这是我用于放置在单元格上的按钮的代码。

@IBAction func article(sender: AnyObject)
    {
        // Pulling the most recent story to display on the HomeViewController
        let fetchRequest = NSFetchRequest(entityName: "Article")
        let predicate = NSPredicate(format: "feed == 'FLO Cycling' OR feed == 'Triathlete' OR feed == 'Velo News' OR feed == 'Cycling News' OR feed == 'Ironman'")
        fetchRequest.predicate = predicate
        let sortDescriptor = NSSortDescriptor(key: "pubDate", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]

        // Set up NSError for the Fetch
        var fetchError : NSError?
        // When you perform a fetch the returned object is an array of the Atricle Entities.
        let fetchedObjects = self.articleContext.executeFetchRequest(fetchRequest, error: &fetchError) as! [Article]

        //Grab the latest Article and place the title in the label in the HomeViewController
        self.latestArticle = fetchedObjects.last

        // Grab the latestArticleViewController so it can be presented modally.  Make sure you set up the storyboard identifier.
        self.articleView = self.storyboard!.instantiateViewControllerWithIdentifier("ArticleViewController") as? ArticleViewController
        self.articleView!.currentArticle = self.latestArticle
        self.articleView!.articleContext = self.articleContext
        self.presentViewController(self.articleView!, animated: true, completion: nil)
    }

这是我用于didSelectRowAtIndexPath

的代码
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    let selectedArticle = self.fetchedResultsController!.objectAtIndexPath(indexPath) as? Article
    self.articleView = self.storyboard!.instantiateViewControllerWithIdentifier("ArticleViewController") as? ArticleViewController
    self.articleView!.currentArticle = selectedArticle
    self.articleView!.articleContext = self.articleContext
    println("This is coming from didSelectRowAtIndexPath \(self.articleView!.currentArticle!.link)")

    self.navigationController!.pushViewController(self.articleView!, animated: true)

    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}

这是应用程序的图片,单元格上有按钮。

enter image description here

当我点击按钮时会发生这种情况。

enter image description here

这是我触摸单元格时从控制台获得的输出。您可以看到println()显示文章有链接。

  

这来自didSelectRowAtIndexPath http://flocycling.blogspot.com/2015/05/order-20-of-details-its-hard-to-believe.html   致命错误:在解包可选值时意外发现nil

以下是应用崩溃线的屏幕截图。

enter image description here

非常感谢任何帮助。

当前文章声明和初始化

currentArticle在ArticleViewController中以下列方式声明。

    class ArticleViewController: UIViewController, UIWebViewDelegate, MFMailComposeViewControllerDelegate
{
    // Properties
    var currentArticle : Article?
}

对于didSelectRowAtIndexPath方法中的初始化,我执行以下操作来初始化我加载的ArticleViewController的值。

    let selectedArticle = self.fetchedResultsController!.objectAtIndexPath(indexPath) as? Article
self.articleView!.currentArticle = selectedArticle

这相当于我点击按钮时的操作。或者至少我认为它是一样的。

self.latestArticle = fetchedObjects.last
self.articleView!.currentArticle = self.latestArticle

抛出两个错误

  

2015-05-31 18:42:38.227 FLOCycling1.1.1 [98389:6596654] CoreData:   错误:无法在NSManagedObject类上调用指定的初始值设定项   'FLOCycling1_1_1 .Article'2015-05-31 18:42:38.227   FLOCycling1.1.1 [98389:6596654] - [FLOCycling1_1_1。文章链接]:   无法识别的选择器发送到实例0x7f81ead7f940

小心,

乔恩

2 个答案:

答案 0 :(得分:0)

你的var currentArticle没有在你调用时初始化,我在你的图片中看到你已经在你的代码中做了一些懒惰的初始化,重复这个变量并且所有应该开始正常工作,我追加一个以下示例:

Product.facets('phone')[:product_category_id]

我希望能帮到你!

答案 1 :(得分:0)

我不明白为什么这样可以解决问题,但我会解释我的所作所为。也许对Storyboard有更多经验的人可以解释。

我为RSS解析器排序的每个feed使用了几个viewControllers。由于所有文章都以相同的格式显示,因此我使用一个ArticleViewController来显示文章。下图显示了故事板的整体层次结构。最右边的VC是ArticleViewController,左边的七个是RSS提要的VC。

enter image description here

我为每个RSS feed创建了一个segue,以指向ArticleViewController。每个都有一个我可以在prepareForSegue中使用的唯一名称。您可以在下面的缩放视图中看到segues。

enter image description here

最初我尝试使用带有以下代码的prepareForSegue方法将Article对象传递给ArticleViewController。

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
       if segue.identifier == "floArticleSegue"
       {
           if let indexPath = self.storyTableView.indexPathForSelectedRow()            {
               let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Article

               (segue.destinationViewController as! ArticleViewController).currentArticle = object
           }
       }
}

当我这样做时,对象没有传递给Article ViewController。然后我尝试了didSelectRowAtIndexPath方法并发生了同样的问题。为清楚起见,我在这里重复了这个错误。

  

这来自didSelectRowAtIndexPath http://flocycling.blogspot.com/2015/05/order-20-of-details-its-hard-to-believe.html致命错误:在解包可选值时意外发现nil

enter image description here

为了解决这个问题,我将RSS提要VC中的segue删除到了ArticleViewController,并使用了我之前使用的相同代码。该代码如下。

let selectedArticle = self.fetchedResultsController!.objectAtIndexPath(indexPath) as? Article
self.articleView = self.storyboard!.instantiateViewControllerWithIdentifier("ArticleViewController") as? ArticleViewController
self.articleView!.currentArticle = selectedArticle
self.articleView!.articleContext = self.articleContext
println("This is coming from didSelectRowAtIndexPath \(self.articleView!.currentArticle!.link)")

self.navigationController!.pushViewController(self.articleView!, animated: true)

tableView.deselectRowAtIndexPath(indexPath, animated: true)

无论出于何种原因,当从故事板中删除segue时,对象将被传递并且应用程序可以正常运行。我希望这可以帮助别人,也许有人可以解释原因。

小心,

乔恩