【问题标题】:-[__NSArrayI addObject:]: unrecognized selector sent to instance-[__NSArrayI addObject:]: 无法识别的选择器发送到实例
【发布时间】:2023-04-08 18:25:01
【问题描述】:

我有这个代码:

    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)
}

我正在使用 Realm 数据库,并且我试图让数据库的列之一打印在节标题中。我还对所有其他必需的 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) 

顺便说一句,如果您有更好的方法让我从数据库中提取此类项目的代码,请加入! :)

提前致谢

【问题讨论】:

  • “I”代表I可变的。您正在尝试追加到一个不可变数组,这不起作用(出于明显的原因)。
  • 哦,好的,谢谢。那么swift中的普通数组为什么不可变呢?还有我该如何改变这个?干杯
  • 此外,此代码效率低下,因为它为表中的每个部分构建数组,提取单个字符串,然后将数组丢弃。您应该使用另一种方法构建数组,例如获取数据并将其存储在属性中的方法
  • 好的,那么它是否类似于一个提取数据一次并在所有部分中调用它的函数? @Paulw11
  • 是的,您可以创建一次数组并将其存储在一个属性中 - 然后直接引用它

标签: ios uitableview swift realm


【解决方案1】:

allObjects 将返回一个RLMResults 的实例,它是Realms 中的两种列表类型之一,另一种是RLMArray。它们都类似于 NSArrays 或 swift 数组,并实现了一个名为 RLMCollection 的协议。除此之外,这意味着您可以使用普通的[i] 表示法访问其元素。所以你可以简单地写

return Category.allObjects()[section].name

虽然您可能想在返回之前进行一些检查。此外,通常不建议重复allObjects() 查询而不是您需要的次数,因此您可以缓存在惰性实例变量或类似变量中。在这种情况下,可能没有那么多类别/部分标题,所以这应该不是问题。

更重要的是,请记住,尽管您返回的 RLMResults 列表在它是有序列表的意义上是有序的,但Realm,所以下次你做Category.allObjects() 时,你并不能保证以相同的顺序接收对象。所以你应该做的是真正创建一个RLMArrayCategory 对象并将其作为另一个对象的属性。然后订单将被保留。

【讨论】:

    【解决方案2】:

    这是因为AnyObject不支持addObject的方法

    我认为您的想法是希望变量 array 成为 AnyObject 类型的数组。

    你应该这样声明:

    var array:[AnyObject] = []
    

    然后,当您想向数组中添加任何内容时,请执行以下操作:

    array.append(add.name)
    

    【讨论】:

    • 哇,非常感谢! @AnthonyKong 我当时实际上在声明什么,只是作为一个附带问题?
    • var array: AnyObject 表示您将变量“array”声明为类型* AnyObject,可以是任何对象类。接下来将其初始化为 [],这显然使它成为一个 NSArray,您可以通过断点发现它。您可以编写 array.addObject 的原因是您刚刚告诉编译器 array 是一个 AnyObject,因此它可能会响应任何选择器。 *AnyObject 实际上是一个协议,但这只是一个细节。
    【解决方案3】:

    除了@AnthonyKong 指出的内容之外,从上面的代码中有点不清楚为什么您首先需要一个 AnyObject 数组。

    var array = [AnyObject]()
    

    看来您真正想要的是String 的数组?

    var array = [String]()
    

    然后您的退货声明被简化为:

    return array[section]
    

    如果您愿意,您还可以查看 filter 以在您的代码中删除一些几乎是样板逻辑。

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,但使用的是 NSMutableArray。感谢@Gusutafu 上面的评论,将数组设置为@[] 会将其转换为 NSArray。

      我的代码不正确(selectedTags 是一个 NSMutableArray):

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

      这给出了错误 -[__NSArrayI addObject:]: unrecognized selector sent to instance 当我尝试添加对象时。

      我更正的代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2019-08-28
        相关资源
        最近更新 更多