2015-01-31 3 views
1

Я создал tableViewcontroller и присвоил ему пользовательский класс: PFQueryTableViewController в доске объявлений. Я также дал ему parseClassName "userMessage" и по какой-то причине, когда я пытаюсь запустить приложение, я всегда получаю то же сообщение об ошибке: NSInternalInconsistencyException', reason: 'You need to specify a parseClassName for the PFQueryTableViewController. Я не понимаю, почему я получаю эту ошибку, потому что я явно дал классу parseClassName.Вам нужно указать parseClassName для PFQueryTableViewController

Вот мой связанный код PFQueryTabletableViewController:

import UIKit import CoreLocation import Parse

class TableViewController: PFQueryTableViewController, CLLocationManagerDelegate {

let userMessages = ["blah blahh blahhh", "Beep Beep Boop", "Beep Beep Bobbity boop"] 

let locationManager = CLLocationManager() 
var currLocation: CLLocationCoordinate2D? 

override init!(style: UITableViewStyle, className: String!) { 
    super.init(style: style, className: className) 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    self.parseClassName = "userMessage" 
    self.textKey = "text" 
    self.pullToRefreshEnabled = true 
    self.objectsPerPage = 40 

} 





private func alert(message: String){ 
    let alert = UIAlertController(title: "Uh-OH", message: message, preferredStyle: UIAlertControllerStyle.Alert) 
    let action = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil) 
    let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil) 
    let settings = UIAlertAction(title: "Settings", style: UIAlertActionStyle.Default) {(action) -> Void in 
     UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) 
     return 

    } 

    alert.addAction(settings) 
    alert.addAction(action) 
    self.presentViewController(alert, animated: true, completion: nil) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.estimatedRowHeight = 120 
    self.tableView.rowHeight = 120 
    locationManager.desiredAccuracy = 100 
    locationManager.delegate = self 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    alert("Cannot fetch your location!!") 
} 

override func queryForTable() -> PFQuery! { 
    let query = PFQuery(className: "Messages") 
    if let queryLoc = currLocation { 
     query.whereKey("location", nearGeoPoint: PFGeoPoint(latitude: queryLoc.latitude, longitude: queryLoc.longitude), withinMiles: 1) 
     query.limit = 40 
     query.orderByDescending("createdAt") 
    }else { 
     query.whereKey("location", nearGeoPoint: PFGeoPoint(latitude: 37.41182, longitude: -121.941125), withinMiles: 1) 
     query.limit = 40 
     query.orderByDescending("createdAt") 
    } 

    return query 
} 

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    locationManager.stopUpdatingLocation() 
    if(locations.count > 0) { 
     let location = locations[0] as CLLocation 
     println(location.coordinate) 
     currLocation = location.coordinate 
    } else { 
     alert("Cannot fetch your loation") 
    } 
} 

override func objectAtIndexPath(indexPath: NSIndexPath!) -> PFObject! { 
    var obj : PFObject? = nil 
    if(indexPath.row < self.objects.count) { 
     obj = self.objects[indexPath.row] as? PFObject 
    } 
    return obj 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return userMessages.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath!, object: PFObject!) -> PFTableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell 
    cell.messageText.text = object.valueForKey("text") as? String 
    cell.messageText.numberOfLines = 0 
    let views = object.valueForKey("count") as Int 
    cell.numberOfViewsLabel.text = "\(views)" 
    cell.numberOfViewsLabel.text = "\((indexPath.row + 1) * 5)" 
    return cell 
} 

func addToViews(sender: AnyObject) { 
    let hitPoint = sender.convertPoint(CGPointZero, toView: self.tableView) 
    let hitIndex = self.tableView.indexPathForRowAtPoint(hitPoint) 
    let object = objectAtIndexPath(hitIndex) 
    object.incrementKey("count") 
    object.saveInBackgroundWithBlock { (Bool, NSError) -> Void in 
     //blahhh 
    } 
    self.tableView.reloadData() 

} 

} `

ответ

0

parseClassName является только для чтения переменной и используется только тогда, когда подклассов PFObject. https://parse.com/docs/ios/api/Classes/PFObject.html#//api/name/parseClassName

Класс имени объекта.

@property (сильный, только для чтения) NSString * parseClassName

Объявлен в PFObject.h

Obj-C

@implementation MYGame 

@dynamic title; 

+ (NSString *)parseClassName { 
    return @"Game"; 
} 

@end 

Swift

class MYGame: PFObject { 
    class func parseClassName() -> String! { 
     return "Game" 
    } 
} 
0

В моей случай, который я использовал d раскадровки и необходимо было создать метод initWithCoder: в моем подклассе PFQueryTableViewController. Шаблон указал в документации Parse.com не хватает этого метода, но первое замечание по примеру действительно включает пример реализации: https://gist.github.com/jamesyu/ba03c1a550f14f88f95d#gistcomment-74202

сообщение «Вам нужно указать parseClassName для PFQueryTableViewController» генерируется потому что ни один из методов не устанавливает свойство PFQueryTableViewControllerparseClassName. Вы заметите, что свойство определено довольно просто в примере метода initWithStyle:, представленном в документах. Но этот метод не будет называться, если представление загружается через раскадровку: для этого вам нужно установить parseClassName в методе initWithCoder:.

Кроме того, не путайте подклассификацию PFQueryTableViewController за PFObject. Для PFObject вам необходимо создать метод класса с именем parseClassName, а также зарегистрировать подкласс перед вызовом [Parse setApplicationId: help clientKey: ckey]. Вы не делаете эти вещи для PFQueryTableViewController или любого другого контроллера представления ParseUI. Они полагаются на один или несколько методов init.

Смежные вопросы