2016-09-30 3 views
0

Код работал хорошо, когда я использовал Xcode 7.3 с iOS 9, но когда я перешел на Xcode 8 с помощью swift 3, приведенный ниже код показывает мне, что время выполнения ошибка. Тем не менее найти решение для этогоЭкземпляр NSFetchedResultsController требует не-nil fetchRequest и contextObject Context в iOS 10

class TableViewController: UITableViewController,NSFetchedResultsControllerDelegate,UISearchResultsUpdating { 
    var fetchResultController :NSFetchedResultsController<Restaurant>! 
    var searchController : UISearchController! 
    var searchResults :[Restaurant] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let fetchRequest : NSFetchRequest<NSFetchRequestResult> = Restaurant.fetchRequest() 
     let sortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
     fetchRequest.sortDescriptors = [sortDescriptor] 

     if let managedObjectContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext{ 
      fetchResultController = NSFetchedResultsController(fetchRequest: fetchRequest as! NSFetchRequest<Restaurant>, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) 

      fetchResultController.delegate = self 

      do{ 
       try fetchResultController.performFetch() 
       restaurants = fetchResultController.fetchedObjects! 
      } 
      catch{ 
       print(error) 
      } 

     } 
    } 
} 
+0

Это маловероятно, что AppDelegate не существует (в противном случае приложение не запустится) и managedObjectContext в шаблоне основных данных, не является необязательным в любом случае, так что опция привязка не требуется, и вы получили ваш не-ноль объекты. – vadian

+0

я удалил это необязательное связывание. Показывая ту же ошибку – Majid

ответ

-1

Попробуйте это:

-> Перейти к делегату App

Типа это после последнего изогнутой скобки:

let ad = UIApplication.shared.delegate as! AppDelegate 
let context = ad.persistenceContainer.viewContext 

-> Вернуться к TableViewController

Удалить if let.

Тип:

var fetchResultController = NSFetchResultsController(
    fetchRequest: Your fetchRequest, 
    manageObjectContext: context (From the delegate), 
    sectionNameKeyPath: nil, cacheName: nil 
) 
self.fetchResultController = fetchResultController 
1

Из того, что я могу видеть из приведенного ниже кода, вы получаете ресторан объект

var fetchResultController :NSFetchedResultsController<Restaurant>! 
var searchController : UISearchController! 
var searchResults :[Restaurant] = [] 

Но в вашем fetchRequest, вы определяете его как NSFetchRequestResult ,

let fetchRequest : NSFetchRequest<NSFetchRequestResult> = Restaurant.fetchRequest() 

Возможно, это NSFetchRequestResult, но я бы посоветовал вам напрямую его использовать в качестве ресторана. У меня была аналогичная проблема, и это сработало. Попробуйте это и посмотрите, работает ли это.

let fetchRequest : NSFetchRequest<Restaurant> = Restaurant.fetchRequest() 
Смежные вопросы