快速谓词导致错误无法识别选择器发送到实例 0x156c9580'

Posted

技术标签:

【中文标题】快速谓词导致错误无法识别选择器发送到实例 0x156c9580\'【英文标题】:swift predicate results in an error unrecognized selector sent to instance 0x156c9580'快速谓词导致错误无法识别选择器发送到实例 0x156c9580' 【发布时间】:2015-11-05 14:13:06 【问题描述】:

以下代码从核心数据中获取数据。我正在使用时间戳来获得正确的结果,实体运行与位置有关系(这是一个正在运行的应用程序)完整代码向您展示了它的外观。但是,当我尝试获取数据时,一切正常,但是当我使用谓词来父仅来自某个日期和时间的数据时 我收到错误

无法识别的选择器发送到实例 0x156c9580'

我正在使用以下代码来获取数据

func workoutFetch()
        var fetchRequest = NSFetchRequest(entityName: "Run")
        fetchRequest.predicate = NSPredicate(format: "timestamp = %@", "2015-10-13 21:10:31")
        workoutDetails = managedObjectContext?.executeFetchRequest(fetchRequest, error: nil) as! [Run]

        for workout in workoutDetails 
            println(workout.timestamp)
        
    

由于某种原因,当我不使用谓词时代码正在工作,我可以打印出所有时间戳。所以提取工作正常。我当然不是专业人士,而且我真的不擅长核心数据,所以我想知道为什么这不起作用以及如何正确剪切数据库。

完整的代码可以让您对我正在尝试做的事情有所了解。

import UIKit
import MapKit
import HealthKit
import CoreData

class DetailViewController: UIViewController

    var run: Run!

    var workoutDate:String!

    var workoutDetails = [Run]()

    var managedObjectContext: NSManagedObjectContext?

  @IBOutlet weak var snapshotImage: UIImageView!
  @IBOutlet weak var mapView: MKMapView!
  @IBOutlet weak var distanceLabel: UILabel!
  @IBOutlet weak var dateLabel: UILabel!
  @IBOutlet weak var timeLabel: UILabel!
  @IBOutlet weak var paceLabel: UILabel!
  @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    @IBAction func saveWorkout(sender: AnyObject) 
    

  override func viewDidLoad() 
    super.viewDidLoad()
    activityIndicator.hidden = true

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    managedObjectContext = appDelegate.managedObjectContext

    self.navigationController?.setNavigationBarHidden(true, animated: true)

    if (run != nil)

        configureView()

    else

    workoutFetch()

    

  

    func workoutFetch()
        var fetchRequest = NSFetchRequest(entityName: "Run")
        fetchRequest.predicate = NSPredicate(format: "timestamp = %@", "2015-10-13 21:10:31")
        workoutDetails = managedObjectContext?.executeFetchRequest(fetchRequest, error: nil) as! [Run]

        for workout in workoutDetails 
            println(workout.timestamp)
        
    


    @IBAction func slideOutMenu(sender: AnyObject) 
        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left,  animated: true, completion: nil)
    

    @IBAction func musicTapped(sender: AnyObject) 
        var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Right,  animated: true, completion: nil)
    


  func configureView() 
    let distanceQuantity = HKQuantity(unit: HKUnit.meterUnit(), doubleValue: run.distance.doubleValue)
    distanceLabel.text = "Afstand: " + distanceQuantity.description

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = .MediumStyle
    dateLabel.text = dateFormatter.stringFromDate(run.timestamp)

    let secondsQuantity = HKQuantity(unit: HKUnit.secondUnit(), doubleValue: run.duration.doubleValue)
    timeLabel.text = "Tijd: " + secondsQuantity.description

    let paceUnit = HKUnit.secondUnit().unitDividedByUnit(HKUnit.meterUnit())
    let paceQuantity = HKQuantity(unit: paceUnit, doubleValue: run.duration.doubleValue / run.distance.doubleValue)
    paceLabel.text = "Snelheid: " + paceQuantity.description

    loadMap()
  

  func mapRegion() -> MKCoordinateRegion 
    let initialLoc = run.locations.firstObject as! Location

    var minLat = initialLoc.latitude.doubleValue
    var minLng = initialLoc.longitude.doubleValue
    var maxLat = minLat
    var maxLng = minLng

    let locations = run.locations.array as! [Location]

    for location in locations 
      minLat = min(minLat, location.latitude.doubleValue)
      minLng = min(minLng, location.longitude.doubleValue)
      maxLat = max(maxLat, location.latitude.doubleValue)
      maxLng = max(maxLng, location.longitude.doubleValue)
    

    return MKCoordinateRegion(
      center: CLLocationCoordinate2D(latitude: (minLat + maxLat)/2,
        longitude: (minLng + maxLng)/2),
      span: MKCoordinateSpan(latitudeDelta: (maxLat - minLat)*1.1,
        longitudeDelta: (maxLng - minLng)*1.1))
  

  func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! 
    if !overlay.isKindOfClass(MulticolorPolylineSegment) 
      return nil
    

    let polyline = overlay as! MulticolorPolylineSegment
    let renderer = MKPolylineRenderer(polyline: polyline)
    renderer.strokeColor = polyline.color
    renderer.lineWidth = 4
    return renderer
  

  func polyline() -> MKPolyline 
    var coords = [CLLocationCoordinate2D]()

    let locations = run.locations.array as! [Location]
    for location in locations 
      coords.append(CLLocationCoordinate2D(latitude: location.latitude.doubleValue,
        longitude: location.longitude.doubleValue))
    

    return MKPolyline(coordinates: &coords, count: run.locations.count)
  

  func loadMap() 
    if run.locations.count > 0 
      mapView.hidden = false

     else 
      // No locations were found!
      mapView.hidden = true

      UIAlertView(title: "Error",
        message: "Sorry, this run has no locations saved",
        delegate:nil,
        cancelButtonTitle: "OK").show()
    
  



// end of uiviewcontroller class

// MARK: - MKMapViewDelegate
extension DetailViewController: MKMapViewDelegate 

我真的需要一些帮助来解决这个问题,我已经使用它好几天了,但没有更接近解决方案或理解我做错了什么。

谢谢。

【问题讨论】:

【参考方案1】:

您的谓词:"timestamp = %@", "2015-10-13 21:10:31" 正在尝试将 timestampNSDate)与 "2015-10-13 21:10:31"NSString)进行比较。

您需要将字符串替换为日期,通常这将是您使用NSDateComponents 计算的NSDate,或者从其他地方接收(即理想情况下不是您通过转换字符串创建的日期)。

【讨论】:

我注意到我在发布问题后使用的是字符串而不是 nsdate。但是,我在不同的视图控制器中使用 nsfechtedcontroller 获取 nsdate,然后我用所有日期填充数组,然后使用 didselectrow 获取正确的日期并将其传递给下一个视图控制器。问题是我不能用 nsdate 追加数组,似乎 nsdate 不能使用追加。所以我不得不使用 int 然后传递它。现在我需要找到一种将字符串转换为 NSDate 的方法。我怎么做?或者我如何将 NSDate 添加到数组中。 我已经解决了 NSDate 问题,它没有给我任何错误,但它似乎并没有输出任何东西,只有当我不使用谓词时,我才能得到一切。 大概你实际上并不想要谓词中的 =,你想要 但是我正在寻找一个确切的日期,那么我应该使用什么 (==) 或其他什么? = 很好,但必须精确到毫秒才能匹配,因此字符串转换可能不起作用

以上是关于快速谓词导致错误无法识别选择器发送到实例 0x156c9580'的主要内容,如果未能解决你的问题,请参考以下文章

获取常量值:无法识别的选择器发送到实例错误

快速代码崩溃:“发送到实例的无法识别的选择器”

UIButton 的 IBAction 导致无法识别的选择器发送到实例错误 (iOS)

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

删除行时TableView“无法识别的选择器发送到实例”错误

iPhone:“无法识别的选择器已发送到实例”错误