XCode6/Swift:发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】XCode6/Swift:发送到实例的无法识别的选择器【英文标题】:XCode6/Swift: unrecognized selector sent to instance 【发布时间】:2014-06-11 17:49:49 【问题描述】:

自 Swift/ios8 发布以来,我以为我会尝试 iOS 开发,但我无法构建基本的 tableView。

当前在模拟器中加载应用程序时收到以下错误消息(Xcode 说构建完成):

2014-06-11 13:40:56.173 firstapp[2217:85843] -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xb20fcf0
2014-06-11 13:40:56.180 firstapp[2217:85843] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xb20fcf0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00452916 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x01da28d9 objc_exception_throw + 44
    2   CoreFoundation                      0x004596f5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
    3   CoreFoundation                      0x003a4857 ___forwarding___ + 1047
    4   CoreFoundation                      0x003a441e _CF_forwarding_prep_0 + 14
    5   UIKit                               0x00f149aa -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2767
    6   UIKit                               0x00f18ebc -[UITableViewRowData numberOfRows] + 98
    7   UIKit                               0x00d57bb0 -[UITableView noteNumberOfRowsChanged] + 133
    8   UIKit                               0x00d57442 -[UITableView reloadData] + 1055
    9   UIKit                               0x00d5b54d -[UITableView _reloadDataIfNeeded] + 78
    10  UIKit                               0x00d60ed5 -[UITableView layoutSubviews] + 36
    11  UIKit                               0x00cd9223 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 601
    12  libobjc.A.dylib                     0x01db5763 -[NSObject performSelector:withObject:] + 70
    13  QuartzCore                          0x04441b87 -[CALayer layoutSublayers] + 152
    14  QuartzCore                          0x044359e9 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 397
    15  QuartzCore                          0x04441ace -[CALayer layoutIfNeeded] + 160
    16  UIKit                               0x00db72e3 -[UIViewController window:setupWithInterfaceOrientation:] + 309
    17  UIKit                               0x00ca5a80 -[UIWindow _rotateToBounds:withAnimator:transitionContext:] + 667
    18  UIKit                               0x00ca8388 -[UIWindow _rotateWindowToOrientation:updateStatusBar:duration:skipCallbacks:] + 2151
    19  UIKit                               0x00caa074 -[UIWindow _setRotatableClient:toOrientation:applyTransformToWindow:updateStatusBar:duration:force:isRotating:] + 6723
    20  UIKit                               0x00ca785d -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 128
    21  UIKit                               0x00ca77d6 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 84
    22  UIKit                               0x00ca769e -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 115
    23  UIKit                               0x00ca7729 -[UIWindow _setRotatableViewOrientation:duration:force:] + 68
    24  UIKit                               0x00ca66b6 __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke + 120
    25  UIKit                               0x00ca6624 -[UIWindow _updateToInterfaceOrientation:duration:force:] + 406
    26  UIKit                               0x00ca7445 -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] + 905
    27  UIKit                               0x00cacb1f -[UIWindow setDelegate:] + 479
    28  UIKit                               0x00da4177 -[UIViewController _tryBecomeRootViewControllerInWindow:] + 184
    29  UIKit                               0x00c9f69a -[UIWindow addRootViewControllerViewIfPossible] + 683
    30  UIKit                               0x00c9f85c -[UIWindow _setHidden:forced:] + 313
    31  UIKit                               0x00c9fad9 -[UIWindow _orderFrontWithoutMakingKey] + 49
    32  UIKit                               0x00cae47b -[UIWindow makeKeyAndVisible] + 80
    33  UIKit                               0x00c4fa50 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 3228
    34  UIKit                               0x00c528a3 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1507
    35  UIKit                               0x00c6c335 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59
    36  UIKit                               0x00c515e3 -[UIApplication workspaceDidEndTransaction:] + 29
    37  FrontBoardServices                  0x033f42af -[FBSWorkspace clientEndTransaction:] + 87
    38  FrontBoardServices                  0x033fb71d __53-[FBSWorkspaceClient _queue_handleTransactionBookEnd]_block_invoke + 49
    39  CoreFoundation                      0x003772f0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16
    40  CoreFoundation                      0x0036ba83 __CFRunLoopDoBlocks + 195
    41  CoreFoundation                      0x0036b1e8 __CFRunLoopRun + 936
    42  CoreFoundation                      0x0036ab7b CFRunLoopRunSpecific + 443
    43  CoreFoundation                      0x0036a9ab CFRunLoopRunInMode + 123
    44  UIKit                               0x00c50efa -[UIApplication _run] + 571
    45  UIKit                               0x00c54dee UIApplicationMain + 3727
    46  firstapp                            0x00005011 top_level_code + 97
    47  firstapp                            0x0000504b main + 43
    48  libdyld.dylib                       0x022beac5 start + 1
    49  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

我已经尝试跟踪堆栈跟踪到可能导致问题的方法,但找不到任何不寻常的东西(目前正在遵循教程)。我还包括了我的 ViewController.swift:

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int 
        return 10
    


    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! 
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")

        cell.text = "Row #\(indexPath.row)"
        cell.detailTextLabel.text = "Subtitle #\(indexPath.row)"

        return cell
    


编辑:包括 Main.storyboard 的源代码:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6154.17" systemVersion="13D65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="CLE-J8-Gwc">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6153.11"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="53f-Xy-Vbi">
            <objects>
                <viewController id="CLE-J8-Gwc" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="uoO-21-5Iu">
                        <rect key="frame" x="0.0" y="0.0"  />
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Kl0-es-OXb">
                                <rect key="frame" x="0.0" y="0.0"  />
                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <connections>
                                    <outlet property="dataSource" destination="CLE-J8-Gwc" id="HG5-Ye-UOQ"/>
                                    <outlet property="delegate" destination="CLE-J8-Gwc" id="I76-0E-fPy"/>
                                </connections>
                            </tableView>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="yaa-zI-5Eu" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="110.66666666666666" y="562.08333333333337"/>
        </scene>
    </scenes>
    <simulatedMetricsContainer key="defaultSimulatedMetrics">
        <simulatedStatusBarMetrics key="statusBar"/>
        <simulatedOrientationMetrics key="orientation"/>
        <simulatedScreenMetrics key="destination" type="retina4"/>
    </simulatedMetricsContainer> </document>

我检查了大量关于同一错误的问题,但似乎找不到任何特定于 swift 的内容或任何可以解决我当前问题的内容。

谢谢!

【问题讨论】:

我想补充一点,有时没有错误。这是一个 Xcode 错误。您需要做的就是清洁并运行! 【参考方案1】:

如转储的第一行所示,您尝试将 ...numberOfRows... 发送到 UIViewController 类的对象,但该方法仅在您的子类中实现。

在您的 nib 文件中,您需要将视图控制器的类从 UIViewController(默认)更改为 ViewController

打开您的故事板(或 nib 文件)选择控制器本身(它在底部(或 Xcode 6 中的顶部)有一个图标,当您将鼠标悬停在它上面时会显示“查看控制器”。

然后从属性面板中选择第三个图标,然后在顶部显示“自定义类”的地方输入“ViewController”

【讨论】:

对不起,我对 iOS 开发非常陌生,我该怎么做?我尝试查看 .storyboard 文件的源代码,但没有看到对 UIViewController 的任何引用。我也会在问题中包含来源作为编辑 一般来说,不要费心为情节提要发布 xml,不管 xml-philes 怎么说,它并不是真正的人类可读的。 太棒了!好一个!第一次工作。【参考方案2】:

您的表的数据源似乎未设置为您的 ViewController 类:

 -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xb20fcf0

仔细检查以确保您已正确设置您的 XIB 文件/故事板。

【讨论】:

数据源当前如下所示:Imgur【参考方案3】:

我在尝试做同样的事情时遇到了同样的错误 - 在我的 UIViewController 中覆盖来自 UITableViewDataSource 和 UITableViewDelegate 的方法。

在我的例子中,我的 UITableView 的 dataSourcedelegate 出口指向一个 UIView,而不是它周围的 UIViewController。

我通过 ctrl 单击我的表格视图并将上述属性拖放到 UIViewController 上来解决此问题。

【讨论】:

以上是关于XCode6/Swift:发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

UISwipeGesture '发送到实例的无法识别的选择器'

无法识别的选择器发送到实例

[UICollectionViewCell imageView]:无法识别的选择器发送到实例

无法识别的选择器发送到数组中的实例[重复]

如何解决“发送到实例的无法识别的选择器”?

无法识别的选择器发送到实例 Objective-C