#core-data #nsarray #swift #nsmanagedobjectcontext #ios8
#основные данные #nsarray #swift #nsmanagedobjectcontext #ios8
Вопрос:
Пытаюсь работать с основными данными в Swift. Нашел этот пример:
http://www.sep.com/sep-blog/2014/06/23/a-c-developer-learns-swift-part-1-core-data/
Создан объект «Person» с двумя строковыми полями — lastname и firstname. Создан UITableViewController (MainTableViewController) для отображения записей на экране. Создан UIViewController (DetailViewController) для добавления новых записей. Создал свой собственный класс (AddrBook) для данных объектов.
Не работает отображение записей, содержащихся в сущности в основном классе — MainTableViewController.
Мой класс AddrBook.swift:
import UIKit
import CoreData
@objc(AddrBook)
class AddrBook: NSManagedObject {
@NSManaged var lastname:String
@NSManaged var firstname:String
}
UIViewController для добавления новых записей. DetailViewController.swift:
import UIKit
import CoreData
class DetailViewController: UIViewController {
@IBOutlet var lastNameField : UITextField = nil
@IBOutlet var firstNameField : UITextField = nil
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func saveButtonPressed(sender : AnyObject) {
let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDelegate.managedObjectContext
let projectEntity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
var newPerson = AddrBook(entity: projectEntity, insertIntoManagedObjectContext: context)
newPerson.lastname = lastNameField.text
newPerson.firstname = firstNameField.text
context.save(nil)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
Теоретически, в этом классе все идет хорошо. Запись должна быть добавлена.
Основной класс MainTableViewController.swift. Для отображения записей. Пытаюсь получить их через NSLog:
import UIKit
import CoreData
class MainTableViewController: UITableViewController {
init(style: UITableViewStyle) {
super.init(style: style)
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
let request = NSFetchRequest(entityName: "Person")
request.returnsObjectsAsFaults = false
let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDelegate.managedObjectContext
var results:NSArray = context.executeFetchRequest(request, error: nil)
for currentPerson in results as AddrBook[] {
NSLog("(currentPerson.lastname)")
NSLog("(currentPerson.firstname)")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
return 1
}
override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
return 0
}
}
Показывает, что в выражении есть ошибка
for currentPerson in results as AddrBook[] {
Ошибка:
Не удается преобразовать тип выражения ‘AddrBook []’ в тип ‘AddrBook[]’
Что я делаю не так?
для LombaX:
override func viewDidLoad() {
super.viewDidLoad()
let request = NSFetchRequest(entityName: "Person")
request.returnsObjectsAsFaults = false
let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDelegate.managedObjectContext
var results : AddrBook[]? = context.executeFetchRequest(request, error: nil) as? AddrBook[]
NSLog("(results)")
if let array = results // check for nil and unwrap
{
for currentPerson in array as AddrBook[] {
NSLog("(currentPerson.lastname)")
NSLog("(currentPerson.firstname)")
}
}
// var results:NSArray = context.executeFetchRequest(request, error: nil)
/*for currentPerson in results as AddrBook[] {
NSLog("(currentPerson.lastname)")
NSLog("(currentPerson.firstname)")
}*/
}
Вывод NSLog — 2014-06-24 21:25:41.243 урок-12-swift[1651:136375] ноль
Переменные результаты равны нулю :- (
Ссылка на проект в Dropbox:https://www.dropbox.com/s/q42rw5fw470timi/lesson-12-swift.zip
Комментарии:
2. Пробовал. Скриншот результата: результаты ссылки =(_PFArray *)@ «1 объект» [0] (<недопустимый>)
3. Окно переменной теперь немного прослушивается… что, если вы напечатаете nn(результаты)?
Ответ №1:
Сначала убедитесь, что вы заполнили класс в модели данных: As ProjectName.AddrBook
(для классов swift вы должны указать даже название проекта). (ПРИМЕЧАНИЕ: это необходимо, только если вы не использовали префикс @objc(AddrBook) перед классом, но я вижу, что вы его использовали, так что это не проблема).
или
как и в AddrBook, как на этом изображении в разделе класса, вверху справа
Кроме того, измените свое приведение следующим образом:
// since executeFetchRequest can return nil, cast it as an optional array of [AddrBook]
// note: the first [AddrBook]? Can be omitted
var results : [AddrBook]? = context.executeFetchRequest(request, error: nil) as? [AddrBook]
if let array = results // check for nil and unwrap
{
for currentPerson in array as [AddrBook] {
// print
}
}
Или, менее явный и без проверки на ноль
var results = context.executeFetchRequest(request, error: nil)
for currentPerson in results as [AddrBook] {
// print
}
Комментарии:
1. Пожалуйста, добавьте детали к исходному вопросу, а не в качестве нового ответа. Однако, если результаты равны нулю, вы должны проверить наличие ошибки. Передайте переменную NSError как amp;error и проверьте возвращенную ошибку
2. Не могли бы вы посмотреть мой проект и помочь разобраться? Пожалуйста… Ссылка на Dropbox: dropbox.com/s/q42rw5fw470timi/lesson-12-swift.zip
3. Посмотрите на добавленное изображение, это была ваша проблема. Я быстро проверил, если это не сработает, я проверю еще раз, как только вернусь к ПК (1-2 часа)
4. Да! Это работа! Я сделал это: prntscr.com/3w2seg И это результат: prntscr.com/3w2tph Теперь я постараюсь продолжить работу с Core Data. Спасибо! Могу ли я задать пару вопросов позже? 🙂
Ответ №2:
let arrayresult = context!.executeFetchRequest(request, error: amp;error)
var arrayvalues=NSArray(array: arrayresult!)
for obj in arrayvalues as [AddrBook]
{
}