我遇到了一个令我困惑的问题。我正在将一个项目从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)
}
这是应用程序的图片,单元格上有按钮。
当我点击按钮时会发生这种情况。
这是我触摸单元格时从控制台获得的输出。您可以看到println()显示文章有链接。
这来自didSelectRowAtIndexPath http://flocycling.blogspot.com/2015/05/order-20-of-details-its-hard-to-believe.html 致命错误:在解包可选值时意外发现nil
以下是应用崩溃线的屏幕截图。
非常感谢任何帮助。
当前文章声明和初始化
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
小心,
乔恩
答案 0 :(得分:0)
你的var currentArticle没有在你调用时初始化,我在你的图片中看到你已经在你的代码中做了一些懒惰的初始化,重复这个变量并且所有应该开始正常工作,我追加一个以下示例:
Product.facets('phone')[:product_category_id]
我希望能帮到你!
答案 1 :(得分:0)
我不明白为什么这样可以解决问题,但我会解释我的所作所为。也许对Storyboard有更多经验的人可以解释。
我为RSS解析器排序的每个feed使用了几个viewControllers。由于所有文章都以相同的格式显示,因此我使用一个ArticleViewController来显示文章。下图显示了故事板的整体层次结构。最右边的VC是ArticleViewController,左边的七个是RSS提要的VC。
我为每个RSS feed创建了一个segue,以指向ArticleViewController。每个都有一个我可以在prepareForSegue中使用的唯一名称。您可以在下面的缩放视图中看到segues。
最初我尝试使用带有以下代码的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
为了解决这个问题,我将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时,对象将被传递并且应用程序可以正常运行。我希望这可以帮助别人,也许有人可以解释原因。
小心,
乔恩