错误:无法将[anyobject]转换为类型数组< _>在胁迫中

时间:2015-12-04 13:14:22

标签: ios arrays swift swift2 uisearchcontroller

我在我的UITablView上实现了UISearchController及其工作正常,但我正在尝试实现PrepareForSegue {...}但是我的Func上出现了一些错误:updateSearchResultsForSearchController

//声明变量//

    var searchNotes = PFObject(className: "MyClass")
    var filteredNotes: NSMutableArray! = NSMutableArray()

    var resultSearchController = UISearchController()
     var searchActive: Bool = false

.................................. ..................

     override func viewDidLoad() {
    super.viewDidLoad()

    self.resultSearchController = UISearchController(searchResultsController: nil)
    self.resultSearchController.searchResultsUpdater = self

    self.resultSearchController.dimsBackgroundDuringPresentation = false
    self.resultSearchController.searchBar.sizeToFit()

    self.tableView.tableHeaderView = self.resultSearchController.searchBar

    self.tableView.reloadData()
    self.definesPresentationContext = true   //self takes priority over the searchController presentation
    self.resultSearchController.hidesNavigationBarDuringPresentation = false
 }

   // MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    if self.resultSearchController.active
    {
        return self.filteredNotes.count
    }else{

        return self.noteObjects.count
    }}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MasterTableViewCell


    if self.resultSearchController.active
    {
        cell.textLabel?.text = self.filteredNotes[indexPath.row] as? String





        searchNotes  = (self.noteObjects.objectAtIndex(indexPath.row) as? PFObject)!
        cell.MasterTitleLabel?.text = searchNotes["Title"] as? String

        cell.MasterTextLabel.text = searchNotes["Fstory"] as? String
        cell.MasterTimeLabel.text = searchNotes["Time"] as? String
        cell.MasterLocationLabel.text =  searchNotes["Location"] as? String


        return cell

    } else {
        let object : PFObject = self.noteObjects.objectAtIndex(indexPath.row) as! PFObject



        cell.MasterTitleLabel?.text = object["Title"] as? String
        cell.MasterTextLabel.text = object["Fstory"] as? String
        cell.MasterTimeLabel.text = object["Time"] as? String
        cell.MasterLocationLabel.text = object["Location"] as? String



        return cell
    }}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var object :AnyObject?
    if self.resultSearchController.active{
        object = filteredNotes[indexPath.row]
        print(filteredNotes[indexPath.row])
        self.performSegueWithIdentifier("openStory", sender: self)

    } else {

        object = self.noteObjects[indexPath.row]
        print(noteObjects[indexPath.row])

        self.performSegueWithIdentifier("openStory", sender: self)
    }}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    let upcoming: AddNoteTableViewController = segue.destinationViewController as! AddNoteTableViewController

    if (segue.identifier == "openStory"){

        let indexPath = self.tableView.indexPathForSelectedRow!

        if self.resultSearchController.active
        {

            let object: PFObject = self.filteredNotes.objectAtIndex(indexPath.row) as! PFObject



            upcoming.object = object

        }
        else{

            let object: PFObject = self.noteObjects.objectAtIndex(indexPath.row) as! PFObject

            upcoming.object = object

            self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
        }}}

   override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}
                                                                           override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.Delete ){

        if self.resultSearchController.active
        {


        }else{



            let object : PFObject = self.noteObjects.objectAtIndex(indexPath.row) as! PFObject
            // the below for deleting the selected cell's object from server's database
            // object.deleteInBackground()

            //the below for deleting the selected cell's object from localstorage
            object.unpinInBackground()


            self.noteObjects.removeObjectAtIndex(indexPath.row)
        }
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

    }
}

   func updateSearchResultsForSearchController(searchController: UISearchController) {

    // self.filteredNotes.removeAll(keepCapacity: false)
    self.filteredNotes.removeAllObjects()

    //        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    //
    //        let array = (self.noteObjects as NSArray).filteredArrayUsingPredicate(searchPredicate)
    //
    //        self.filteredNotes = array as! [String]

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
    var array = (self.noteObjects as! [PFObject]).map { (obj) -> Array<PFObject> in
        obj["Title"] as! Array


    }

//两行中出现错误

    array = (array as NSArray).filteredArrayUsingPredicate(searchPredicate) as Array
    self.filteredNotes = array as  Array


self.tableView.reloadData()
}
}

in array =(array as NSarray)... line error:

  MasterTableViewController.swift:281:36: Cannot convert value of type '[AnyObject]' to type 'Array<_>' in coercion

在self.filterednotes中......行错误:

 MasterTableViewController.swift:282:30: Cannot convert value of type '[[PFObject]]' to type 'Array<_>' in coercion
如果有人知道,请不要知道如何解决这个问题,请告诉我 谢谢

错误:

<Sinhgad: 0x7fa53c02c5c0, objectId: DJ0oIHi9ir, localId: (null)> {
Fstory = "test 33";
Location = "test 3333";
Time = "test 333";
Title = "test 3";
}
2015-12-05 12:50:32.604 Notes[920:81965] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't use in/contains operator with collection <Sinhgad: 0x7fa53c02c5c0, objectId: DJ0oIHi9ir, localId: (null)> {
Fstory = "test 33";
Location = "test 3333";
Time = "test 333";
Title = "test 3";
 } (not a collection)'
*** First throw call stack:
(
0   CoreFoundation                      0x0000000110187e65 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x0000000111ec6deb objc_exception_throw + 48
2   Foundation                          0x000000011059e6b1 -[NSCompoundPredicate evaluateWithObject:substitutionVariables:] + 0
3   Foundation                          0x0000000110575719 -[NSPredicateOperator performOperationUsingObject:andObject:] + 286
4   Foundation                          0x0000000110574e3c -[NSComparisonPredicate evaluateWithObject:substitutionVariables:] + 313
5   Foundation                          0x0000000110574c94 _filterObjectsUsingPredicate + 398
6   Foundation                          0x0000000110574a84 -[NSArray(NSPredicateSupport) filteredArrayUsingPredicate:] + 279
7   Notes                               0x000000010eb087c7 _TFC5Notes25MasterTableViewController38updateSearchResultsForSearchControllerfS0_FCSo18UISearchControllerT_ + 919
8   Notes                               0x000000010eb0896a _TToFC5Notes25MasterTableViewController38updateSearchResultsForSearchControllerfS0_FCSo18UISearchControllerT_ + 58
9   UIKit                               0x00000001113d355d -[UISearchController _performAutomaticPresentation] + 1029
10  UIKit                               0x0000000110d98185 -[UISearchBar(UISearchBarStatic) _searchFieldBeginEditing] + 220
11  UIKit                               0x00000001207d69a8 -[UISearchBarAccessibility _searchFieldBeginEditing] + 45
12  UIKit                               0x00000001109a88c8 -[UIApplication sendAction:to:from:forEvent:] + 92
13  UIKit                               0x0000000110b17328 -[UIControl sendAction:to:forEvent:] + 67
14  UIKit                               0x0000000110b175f4 -[UIControl _sendActionsForEvents:withEvent:] + 311
15  UIKit                               0x00000001113884d8 -[UITextField willAttachFieldEditor:] + 800
16  UIKit                               0x0000000110b214f1 -[UIFieldEditor becomeFieldEditorForView:] + 938
17  UIKit                               0x000000011137c979 -[UITextField _becomeFirstResponder] + 210
18  UIKit                               0x0000000110d9bdc5 -[UISearchBarTextField _becomeFirstResponder] + 96
19  UIKit                               0x000000011137c737 -[UITextField __resumeBecomeFirstResponder] + 52
20  UIKit                               0x0000000110d9c1ce __45-[UISearchBarTextField _becomeFirstResponder]_block_invoke + 447
21  UIKit                               0x00000001109b2bd6 _runAfterCACommitDeferredBlocks + 317
22  UIKit                               0x00000001109c6335 _cleanUpAfterCAFlushAndRunDeferredBlocks + 95
23  UIKit                               0x00000001109d2227 _afterCACommitHandler + 90
24  CoreFoundation                      0x00000001100b3367 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
25  CoreFoundation                      0x00000001100b32d7 __CFRunLoopDoObservers + 391
26  CoreFoundation                      0x00000001100a8f2b __CFRunLoopRun + 1147
27  CoreFoundation                      0x00000001100a8828 CFRunLoopRunSpecific + 488
28  GraphicsServices                    0x0000000113cf9ad2 GSEventRunModal + 161
29  UIKit                               0x00000001109a6d44 UIApplicationMain + 171
30  Notes                               0x000000010eafec0d main + 109
31  libdyld.dylib                       0x000000011304c92d start + 1
32  ???                                 0x0000000000000001 0x0 + 1
   )

libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

1 个答案:

答案 0 :(得分:0)

我不确定你的代码中是如何定义noteObjects的。 我认为你的问题是你投射的方式太多了,并试图投射到简单的“阵列”并不是你想要的。尝试类似下面的内容。

var noteObjects = [PFObject]()
var filteredNotes = [PFObject]()
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = (noteObjects as NSArray).filteredArrayUsingPredicate(searchPredicate)
filteredNotes = array as! [PFObject]

如果你真的希望noteObjects和filteredNotes是NSMutableArray而不是Swift数组,你可以试试以下内容。

var noteObjects = NSMutableArray()
var filteredNotes = NSMutableArray()
let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
let array = noteObjects.filteredArrayUsingPredicate(searchPredicate)
filteredNotes = NSMutableArray(array: array)