2014-10-26 5 views
0

у меня есть этот код:- [__ NSArrayI AddObject]: непризнанные селектор направил к экземпляру

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    var array: AnyObject = [] 
    for obj in Category.allObjects() { 
     if var add = obj as? Category { 
      array.addObject(add.name) 
      println(add.name) 
     } 
    } 

    return String(array[section] as String) 
} 

Im, используя базу данных Realm, и я пытаюсь получить один из столбцов базы данных для печати в разделе заголовки. Im также используя один и тот же процесс для всех других методов, необходимых UITableView например/numberOfSectionsInTable и т.д. и т.п. Код дает мне эту ошибку:

2014-10-26 20:47:33.479 Project[14631:937721] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fdaf270ddb0 
2014-10-26 20:47:33.481 Project[14631:937721] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fdaf270ddb0' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0000000109960f35 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x00000001095f9bb7 objc_exception_throw + 45 
    2 CoreFoundation      0x000000010996804d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x00000001098c027c ___forwarding___ + 988 
    4 CoreFoundation      0x00000001098bfe18 _CF_forwarding_prep_0 + 120 
    5 BuildersUtility      0x0000000108d7f720 _TFC15BuildersUtility29ProductsDetailsViewController27numberOfSectionsInTableViewfS0_FCSo11UITableViewSi + 1408 
    6 BuildersUtility      0x0000000108d7f8ca _TToFC15BuildersUtility29ProductsDetailsViewController27numberOfSectionsInTableViewfS0_FCSo11UITableViewSi + 58 
    7 UIKit        0x000000010a478a7e -[UITableViewRowData _updateNumSections] + 84 
    8 UIKit        0x000000010a479474 -[UITableViewRowData invalidateAllSections] + 69 
    9 UIKit        0x000000010a2cdb03 -[UITableView _updateRowData] + 214 
    10 UIKit        0x000000010a2e300f -[UITableView numberOfSections] + 27 
    11 UIKit        0x000000010a4e0645 -[UITableViewController viewWillAppear:] + 97 
    12 UIKit        0x000000010a327821 -[UIViewController _setViewAppearState:isAnimating:] + 487 
    13 UIKit        0x000000010a352960 -[UINavigationController _startTransition:fromViewController:toViewController:] + 776 
    14 UIKit        0x000000010a353487 -[UINavigationController _startDeferredTransitionIfNeeded:] + 523 
    15 UIKit        0x000000010a353f47 -[UINavigationController __viewWillLayoutSubviews] + 43 
    16 UIKit        0x000000010a499509 -[UILayoutContainerView layoutSubviews] + 202 
    17 UIKit        0x000000010a277973 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521 
    18 QuartzCore       0x000000010a089de8 -[CALayer layoutSublayers] + 150 
    19 QuartzCore       0x000000010a07ea0e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380 
    20 QuartzCore       0x000000010a07e87e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 
    21 QuartzCore       0x0000000109fec63e _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242 
    22 QuartzCore       0x0000000109fed74a _ZN2CA11Transaction6commitEv + 390 
    23 QuartzCore       0x0000000109feddb5 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89 
    24 CoreFoundation      0x0000000109895dc7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
    25 CoreFoundation      0x0000000109895d20 __CFRunLoopDoObservers + 368 
    26 CoreFoundation      0x000000010988bb53 __CFRunLoopRun + 1123 
    27 CoreFoundation      0x000000010988b486 CFRunLoopRunSpecific + 470 
    28 GraphicsServices     0x000000010dec79f0 GSEventRunModal + 161 
    29 UIKit        0x000000010a1fe420 UIApplicationMain + 1282 
    30 BuildersUtility      0x0000000108d9589e top_level_code + 78 
    31 BuildersUtility      0x0000000108d958da main + 42 
    32 libdyld.dylib      0x000000010baaf145 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

BTW, если у вас есть лучший способ для меня, чтобы извлечь код из базы данных для проекта, как это, пожалуйста, чириканье! :)

Заранее спасибо

+0

"I" означает ** I ** mmutable. Вы пытаетесь добавить к неизменяемому массиву, который не работает (по понятным причинам). –

+0

О, хорошо спасибо. так как же обычные массивы в быстром не изменяются? а также как это изменить? Cheers – Tomblasta

+0

Кроме того, этот код неэффективен, поскольку он создает массив для каждого раздела в вашей таблице, извлекает одну строку и затем отбрасывает массив. Вы должны построить массив в другом методе, таком как метод, который извлекает ваши данные и сохраняет их в свойстве – Paulw11

ответ

2

allObjects вернет вам экземпляр RLMResults, который является одним из двух типов списка в Царствах, а другой - RLMArray. Они оба сделаны похожими на NSArrays или быстрыми массивами и реализуют протокол под названием RLMCollection. Помимо прочего, это означает, что вы можете получить доступ к своим элементам с обычной записью [i]. Таким образом, вы можете просто написать

return Category.allObjects()[section].name 

хотя, возможно, вы захотите сделать некоторую проверку перед возвратом. Кроме того, обычно не рекомендуется повторять запрос allObjects() больше, чем вам нужно, поэтому вы можете кэшировать ленивую переменную экземпляра или подобное. В этом случае, вероятно, не так много заголовков категорий/секций, поэтому это не должно быть проблемой.

Что еще более важно, иметь в виду, что хотя RLMResults список вы получите обратно является заказана в том смысле, что он не упорядоченный список, не существует внутренний порядок среди Category экземпляров в Realm, поэтому в следующий раз, когда вы do Category.allObjects(), вы на самом деле не гарантированно получите объекты в том же порядке. Так что вы должны сделать, это создать RLMArray объектов Category и сделать это свойство другого объекта. Тогда порядок будет сохранен.

+0

Привет, получаю такую ​​же проблему: https://github.com/realm/realm-cocoa/issues/2720 –

2

Это происходит потому, что AnyObject не поддерживает метод addObject

Я думаю, что вы имеете в виду, что вы хотите, чтобы переменная array быть массивом типа AnyObject.

Вы должны объявить это следующим образом:

var array:[AnyObject] = [] 

И тогда, когда вы хотите что-нибудь добавить в массив, сделайте следующее:

array.append(add.name) 
+0

Спасибо большое! @AnthonyKong Что я на самом деле объявлял тогда, как побочные вопросы? – Tomblasta

+1

var array: AnyObject означает, что вы объявляете переменную 'array' как тип * AnyObject, который может быть любым классом объектов. Затем вы инициализируете его [], что, по-видимому, делает его NSArray, который вы можете обнаружить с помощью точки останова. Причина, по которой вы можете написать array.addObject, заключается в том, что вы просто сказали компилятору, что массив является AnyObject, поэтому он может потенциально реагировать на любой селектор. * AnyObject на самом деле является протоколом, но это всего лишь деталь. – Gusutafu

+0

О, ничего себе! мне действительно нужно читать этот материал! Спасибо – Tomblasta

2

В дополнение к тому, что @AnthonyKong указывает наружу, это немного непонятно из приведенного выше кода, почему вы хотели бы получить массив AnyObject в первую очередь.

var array = [AnyObject]() 

кажется, что вы на самом деле хотите это массив String?

var array = [String]() 

тогда ваше возвращение заявление упрощается до:

return array[section] 

Когда чувство к нему вы можете также посмотреть в filter вырвать некоторые из этой почти-шаблонной-логики в вашем коде ,

0

У меня была аналогичная проблема, но с NSMutableArray. Благодаря замечанию @ Gusutafu выше, что установка массива в @ [] преобразует его в NSArray.

Мой неверный код (selectedTags является NSMutableArray):

selectedTags = ([theInputParameters valueForKey:kAcronymTagsSelectedTags] != nil) 
? [theInputParameters valueForKey:kAcronymTagsSelectedTags] 
: @[]; 

Это дало ошибку - [__ NSArrayI AddObject]: непризнанные селектор направлен например, когда я попытался добавить объект.

Мой исправленный код

selectedTags = ([theInputParameters valueForKey:kAcronymTagsSelectedTags] != nil) 
? [theInputParameters valueForKey:kAcronymTagsSelectedTags] 
: [NSMutableArray arrayWithArray:@[]];