快速谓词导致错误无法识别选择器发送到实例 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"
正在尝试将 timestamp
(NSDate
)与 "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 时发送到实例的无法识别的选择器