带有tableview dequeueReusableCellWithIdentifier

时间:2015-12-29 11:37:02

标签: ios objective-c xcode swift uitableview

我是一个带有自定义tableView单元格的表视图控制器场景的ios项目。当我尝试在cellForRowAtIndexPath方法中为某个插座设置一些值时会抛出此错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

nil值是我的自定义tableView单元类的出口参考。

我无法弄清楚造成这种情况的原因,因为我认为我已经正确配置了所有内容。

这是我使用的代码:

MyTableViewController

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.registerClass(MyTableViewCell.self, forCellReuseIdentifier: "myTableViewCell")
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }

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

        cell.myLabel?.text = "22:40"
        return cell
    }
}

MyTableViewCell

class MyTableViewCell: UITableViewCell {
    @IBOutlet var myLabel: UILabel!
}

Main.storyboard 的部分源代码:

<scene sceneID="lJU-Ak-NqO">
    <objects>
        <tableViewController id="Uep-sz-gtX" customClass="MyTableViewController" customModule="My_App" customModuleProvider="target" sceneMemberID="viewController">
            <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="Ld7-YH-V2O">
                <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                <prototypes>
                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="myTableViewCell" id="Xd0-56-JUL" customClass="MyTableViewCell" customModule="My_App" customModuleProvider="target">
                        <rect key="frame" x="0.0" y="28" width="375" height="44"/>
                        <autoresizingMask key="autoresizingMask"/>
                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Xd0-56-JUL" id="Yrq-Di-Pfr">
                            <rect key="frame" x="0.0" y="0.0" width="375" height="43"/>
                            <autoresizingMask key="autoresizingMask"/>
                            <subviews>
                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="og4-63-SRD">
                                    <rect key="frame" x="8" y="11" width="42" height="21"/>
                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                    <nil key="highlightedColor"/>
                                </label>
                            </subviews>
                        </tableViewCellContentView>
                        <connections>
                            <outlet property="myLabel" destination="og4-63-SRD" id="YpX-Ia-DK7"/>
                        </connections>
                    </tableViewCell>
                </prototypes>
                <connections>
                    <outlet property="dataSource" destination="Uep-sz-gtX" id="8kh-UV-dfO"/>
                    <outlet property="delegate" destination="Uep-sz-gtX" id="xyW-cf-Nth"/>
                </connections>
            </tableView>
            <simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina47"/>
        </tableViewController>
        <placeholder placeholderIdentifier="IBFirstResponder" id="Xja-Ye-Jqb" userLabel="First Responder" sceneMemberID="firstResponder"/>
    </objects>
    <point key="canvasLocation" x="401.5" y="-563.5"/>
</scene>

我已经检查了自定义类控制器和自定义表格视图单元类的故事板设置。甚至单元标识符在xcode属性检查器中也是正确的。

另一个奇怪的行为是我在单元格原型中添加的标签根本不可见(它有默认测试),即使我没有尝试设置自定义文本。如果我尝试调整原型单元格的大小(它显示在它的默认大小),也会出现相同的行为。

更新 正如@dfri所建议的那样,我从零开始创建了一个新的示例项目,一切正常。项目之间的唯一区别是我在这里使用SSASideMenu所以我认为这是导致这个问题的原因。

点击菜单项时用于显示tableView的代码是(as suggested here):

sideMenuViewController?.contentViewController = UINavigationController(rootViewController: (storyBoard.instantiateViewControllerWithIdentifier("MyTableViewController") as? MyTableViewController)!)
sideMenuViewController?.hideMenuViewController()

我将此代码用于其他&#34;普通&#34;查看,但在表视图中我遇到了这个问题。欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

EDIT2(在您添加之后,实际问题不是表格视图控制器,正如您刚刚重新创建项目形式从头开始验证

好的,请尝试替换以下行

sideMenuViewController?.contentViewController = UINavigationController(rootViewController: (storyBoard.instantiateViewControllerWithIdentifier("MyTableViewController") as? MyTableViewController)!)

sideMenuViewController?.contentViewController = UINavigationController(rootViewController: (storyBoard.instantiateViewControllerWithIdentifier("MyTableViewController") as! UITableViewController))

你知道你MyTableViewController(顺便说一下,你确定你不应该在这里使用myTableViewController标识符吗?区分大小写..)是UITableViewController的子类,因此,您可以使用强制转换as!将其强制转换为其父级UITableViewControllerUINavigationController(rootViewController: ...UIViewController为参数,因此您需要转换为Xcode可以评估为UIViewController对象的内容。

编辑(添加Main.storyboard 的部分源代码后)

在刚刚发布的故事板笔尖中,我们发现您的自定义类reuseIdentifier"MyTableViewCell"reuseIdentifier="MyTableViewCell"),而非myTableViewCell(区分大小写),后者是您在尝试访问单元格时在表视图控制器中使用的内容。因此,最好将重用标识符(通过属性检查器)更新为myTableViewCell

另外,从self.tableView.registerClass(MyTableViewCell.self, forCellReuseIdentifier: "myTableViewCell")方法中移除viewDidLoad行;在这种情况下,您不需要显式注册该类(已经与故事板中的自定义单元类建立了连接)。

另请注意,自定义表格视图单元格类myLabel中的MyTableViewCell不是可选的,因此您不应包含?运算符访问它。

将第cell.myLabel?.text = "22:40"行更改为

cell.myLabel.text = "22:40"

如果上述内容没有解决您的错误,请在此主题中查看我的答案:

它详细描述了像你这样的案例,所以你应该能够作为一个&#34;教程&#34;一步一步地检查你的代码。