不使用自动布局时PrepareForSege崩溃

时间:2016-02-16 15:01:44

标签: ios objective-c crash viewcontroller

我有两个Xcode项目,第一个叫做blank,新的和使用自动布局(默认)。第二个称为test,并未使用自动布局(而是使用iPhone布局)。

在测试项目中,方法prepareForSegue崩溃:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = self.objects[indexPath.row];
        /*The program crashed here */ DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController];
        [controller setDetailItem:object];
        controller.navigationItem.leftBarButtonItem =     self.splitViewController.displayModeButtonItem;
        controller.navigationItem.leftItemsSupplementBackButton = YES;
    }
}

除了故事板的XML文件之外,两个项目之间的代码没有差异。

blank的故事板:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="H1p-Uh-vWS">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
    </dependencies>
    <scenes>
        <!--Master-->
        <scene sceneID="pY4-Hu-kfo">
            <objects>
                <navigationController title="Master" id="RMx-3f-FxP" sceneMemberID="viewController">
                    <navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="Pmd-2v-anx">
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <connections>
                        <segue destination="7bK-jq-Zjz" kind="relationship" relationship="rootViewController" id="tsl-Nk-0bq"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="8fS-aE-onr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-38" y="-630"/>
        </scene>
        <!--Detail-->
        <scene sceneID="yUG-lL-AsK">
            <objects>
                <viewController title="Detail" id="JEX-9P-axG" customClass="DetailViewController" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="SYR-Wa-9uf"/>
                        <viewControllerLayoutGuide type="bottom" id="GAO-Cl-Wes"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="svH-Pt-448">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">
                                <rect key="frame" x="20" y="292" width="560" height="17"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <fontDescription key="fontDescription" type="system" size="system"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                        <constraints>
                            <constraint firstItem="0XM-y9-sOw" firstAttribute="leading" secondItem="svH-Pt-448" secondAttribute="leading" constant="20" symbolic="YES" id="Tsc-yG-G1q"/>
                            <constraint firstItem="0XM-y9-sOw" firstAttribute="centerY" secondItem="svH-Pt-448" secondAttribute="centerY" id="jWN-iV-94e"/>
                            <constraint firstAttribute="trailing" secondItem="0XM-y9-sOw" secondAttribute="trailing" constant="20" symbolic="YES" id="tHV-ZD-HQj"/>
                        </constraints>
                    </view>
                    <toolbarItems/>
                    <navigationItem key="navigationItem" title="Detail" id="mOI-FS-AaM"/>
                    <connections>
                        <outlet property="detailDescriptionLabel" destination="0XM-y9-sOw" id="deQ-Na-JPF"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="FJe-Yq-33r" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="709" y="129"/>
        </scene>
        <!--Split View Controller-->
        <scene sceneID="Nki-YV-4Qg">
            <objects>
                <splitViewController id="H1p-Uh-vWS" sceneMemberID="viewController">
                    <toolbarItems/>
                    <connections>
                        <segue destination="RMx-3f-FxP" kind="relationship" relationship="masterViewController" id="BlO-5A-QYV"/>
                        <segue destination="vC3-pB-5Vb" kind="relationship" relationship="detailViewController" id="Tll-UG-LXB"/>
                    </connections>
                </splitViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="cZU-Oi-B1e" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-856" y="-330"/>
        </scene>
        <!--Master-->
        <scene sceneID="smW-Zh-WAh">
            <objects>
                <tableViewController title="Master" clearsSelectionOnViewWillAppear="NO" id="7bK-jq-Zjz" customClass="MasterViewController" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="r7i-6Z-zg0">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <prototypes>
                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="Arm-wq-HPj" style="IBUITableViewCellStyleDefault" id="WCw-Qf-5nD">
                                <rect key="frame" x="0.0" y="86" width="600" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg">
                                    <rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Arm-wq-HPj">
                                            <rect key="frame" x="15" y="0.0" width="570" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                            <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                        </label>
                                    </subviews>
                                </tableViewCellContentView>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <connections>
                                    <segue destination="vC3-pB-5Vb" kind="showDetail" identifier="showDetail" id="6S0-TO-JiA"/>
                                </connections>
                            </tableViewCell>
                        </prototypes>
                        <sections/>
                        <connections>
                            <outlet property="dataSource" destination="7bK-jq-Zjz" id="Gho-Na-rnu"/>
                            <outlet property="delegate" destination="7bK-jq-Zjz" id="RA6-mI-bju"/>
                        </connections>
                    </tableView>
                    <navigationItem key="navigationItem" title="Master" id="Zdf-7t-Un8"/>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="Rux-fX-hf1" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="709" y="-630"/>
        </scene>
        <!--Navigation Controller-->
        <scene sceneID="r7l-gg-dq7">
            <objects>
                <navigationController id="vC3-pB-5Vb" sceneMemberID="viewController">
                    <navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="DjV-YW-jjY">
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <connections>
                        <segue destination="JEX-9P-axG" kind="relationship" relationship="rootViewController" id="GKi-kA-LjT"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="SLD-UC-DBI" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-45" y="129"/>
        </scene>
    </scenes>
    <inferredMetricsTieBreakers>
        <segue reference="6S0-TO-JiA"/>
    </inferredMetricsTieBreakers>
</document>

test的故事板:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="H1p-Uh-vWS">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
    </dependencies>
    <scenes>
        <!--Master-->
        <scene sceneID="pY4-Hu-kfo">
            <objects>
                <navigationController title="Master" id="RMx-3f-FxP" sceneMemberID="viewController">
                    <navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="Pmd-2v-anx">
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <connections>
                        <segue destination="7bK-jq-Zjz" kind="relationship" relationship="rootViewController" id="tsl-Nk-0bq"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="8fS-aE-onr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-20.266666666666666" y="-596.39999999999998"/>
        </scene>
        <!--Detail-->
        <scene sceneID="yUG-lL-AsK">
            <objects>
                <viewController title="Detail" id="JEX-9P-axG" customClass="DetailViewController" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="svH-Pt-448">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" id="0XM-y9-sOw">
                                <rect key="frame" x="8" y="262" width="280" height="17"/>
                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <fontDescription key="fontDescription" type="system" size="system"/>
                                <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                <nil key="highlightedColor"/>
                            </label>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                    </view>
                    <toolbarItems/>
                    <navigationItem key="navigationItem" title="Detail" id="mOI-FS-AaM"/>
                    <connections>
                        <outlet property="detailDescriptionLabel" destination="0XM-y9-sOw" id="deQ-Na-JPF"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="FJe-Yq-33r" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="405.86666666666667" y="163.77333333333334"/>
        </scene>
        <!--Split View Controller-->
        <scene sceneID="Nki-YV-4Qg">
            <objects>
                <splitViewController id="H1p-Uh-vWS" sceneMemberID="viewController">
                    <toolbarItems/>
                    <connections>
                        <segue destination="RMx-3f-FxP" kind="relationship" relationship="masterViewController" id="BlO-5A-QYV"/>
                        <segue destination="vC3-pB-5Vb" kind="relationship" relationship="detailViewController" id="Tll-UG-LXB"/>
                    </connections>
                </splitViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="cZU-Oi-B1e" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-456.5333333333333" y="-312.39999999999998"/>
        </scene>
        <!--Master-->
        <scene sceneID="smW-Zh-WAh">
            <objects>
                <tableViewController title="Master" clearsSelectionOnViewWillAppear="NO" id="7bK-jq-Zjz" customClass="MasterViewController" sceneMemberID="viewController">
                    <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="r7i-6Z-zg0">
                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                        <prototypes>
                            <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="Arm-wq-HPj" style="IBUITableViewCellStyleDefault" id="WCw-Qf-5nD">
                                <rect key="frame" x="0.0" y="86" width="320" height="44"/>
                                <autoresizingMask key="autoresizingMask"/>
                                <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WCw-Qf-5nD" id="37f-cq-3Eg">
                                    <rect key="frame" x="0.0" y="0.0" width="287" height="43.5"/>
                                    <autoresizingMask key="autoresizingMask"/>
                                    <subviews>
                                        <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Arm-wq-HPj">
                                            <rect key="frame" x="15" y="0.0" width="270" height="43.5"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
                                            <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
                                        </label>
                                    </subviews>
                                </tableViewCellContentView>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                                <connections>
                                    <segue destination="JEX-9P-axG" kind="push" identifier="showDetail" id="6S0-TO-JiA"/>
                                </connections>
                            </tableViewCell>
                        </prototypes>
                        <sections/>
                        <connections>
                            <outlet property="dataSource" destination="7bK-jq-Zjz" id="Gho-Na-rnu"/>
                            <outlet property="delegate" destination="7bK-jq-Zjz" id="RA6-mI-bju"/>
                        </connections>
                    </tableView>
                    <navigationItem key="navigationItem" title="Master" id="Zdf-7t-Un8"/>
                </tableViewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="Rux-fX-hf1" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="378.13333333333333" y="-596.39999999999998"/>
        </scene>
        <!--Navigation Controller-->
        <scene sceneID="r7l-gg-dq7">
            <objects>
                <navigationController id="vC3-pB-5Vb" sceneMemberID="viewController">
                    <navigationBar key="navigationBar" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="DjV-YW-jjY">
                        <autoresizingMask key="autoresizingMask"/>
                    </navigationBar>
                    <connections>
                        <segue destination="JEX-9P-axG" kind="relationship" relationship="rootViewController" id="GKi-kA-LjT"/>
                    </connections>
                </navigationController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="SLD-UC-DBI" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-24" y="122.12"/>
        </scene>
    </scenes>
    <inferredMetricsTieBreakers>
        <segue reference="6S0-TO-JiA"/>
    </inferredMetricsTieBreakers>
</document>


因此,当我启动test时,收到此错误消息:

2016-02-16 15:40:58.960 test[75054:13748065] -[DetailViewController topViewController]: unrecognized selector sent to instance 0x7fbe82c3c480
2016-02-16 15:40:58.964 test[75054:13748065] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DetailViewController topViewController]: unrecognized selector sent to instance 0x7fbe82c3c480'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010ed14e65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010e78ddeb objc_exception_throw + 48
    2   CoreFoundation                      0x000000010ed1d48d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010ec6a90a ___forwarding___ + 970
    4   CoreFoundation                      0x000000010ec6a4b8 _CF_forwarding_prep_0 + 120
    5   test                                0x000000010e28c459 -[MasterViewController prepareForSegue:sender:] + 377
    6   UIKit                               0x000000010f7eaf01 -[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 369
    7   UIKit                               0x000000010f7ead5f -[UIStoryboardSegueTemplate _perform:] + 82
    8   UIKit                               0x000000010f7eb023 -[UIStoryboardSegueTemplate perform:] + 156
    9   UIKit                               0x000000010f204cee -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1775
    10  UIKit                               0x000000010f204fb3 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 388
    11  UIKit                               0x000000010f0cd4a2 _runAfterCACommitDeferredBlocks + 317
    12  UIKit                               0x000000010f0e0c01 _cleanUpAfterCAFlushAndRunDeferredBlocks + 95
    13  UIKit                               0x000000010f0ecaf3 _afterCACommitHandler + 90
    14  CoreFoundation                      0x000000010ec40367 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    15  CoreFoundation                      0x000000010ec402d7 __CFRunLoopDoObservers + 391
    16  CoreFoundation                      0x000000010ec35f2b __CFRunLoopRun + 1147
    17  CoreFoundation                      0x000000010ec35828 CFRunLoopRunSpecific + 488
    18  GraphicsServices                    0x00000001124d1ad2 GSEventRunModal + 161
    19  UIKit                               0x000000010f0c1610 UIApplicationMain + 171
    20  test                                0x000000010e28cc3f main + 111
    21  libdyld.dylib                       0x000000011145092d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

几乎所有的程序都是一样的,所以也许我还没有理解视图控制器是如何工作的......我以为我有。你知道它为什么会这样崩溃吗?

3 个答案:

答案 0 :(得分:0)

[segue destinationViewController]属于id类型。此属性包含视图控制器,其内容应显示在segue的末尾。行[[segue destinationViewController] topViewController](在prepareForSegue :)中崩溃导致destinationViewController没有实现topViewController选择器/属性。 topViewController选择器通常会发送到UINavigationController。所以我猜(没有看到你的其他代码)UINavigationController以某种方式参与你的流程。 Autolayouts与此无关。

只需检查调试目的:

if([segue destinationViewController] isKindOfClass:[UINavigationController class]) { 
   //Should not crash
}
else {
   //Obviously you're doing something wrong
}

答案 1 :(得分:0)

在您的代码行中DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController];表示目标viewController的消息topViewController不存在。

所以它不是Autolayout

的问题

试试这个:DetailViewController *controller = (DetailViewController *)[segue destinationViewController];

如果你想使用topViewController,那么使用self.navigationController topViewController]来获取navigationViewController堆栈中的顶级对象

答案 2 :(得分:0)

由于自动布局但尺寸类不会发生这种情况。 使用Size Classes,您的segue类型为Show Detail,并指向具有DetailViewController作为根视图控制器的UINavigationController。 当您禁用自动布局时,默认情况下禁用大小类,并且您的显示详细信息segue会自动转换为直接指向DetailViewController而不是UINavigationController的Push segue。

所以,

DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController];

无法工作,因为您现在正在处理DetailViewController的实例,而不是UINavigationController。 topViewController是一条消息,您可以发送给UINavigationController,但不能发送给DetailViewController。

尝试

DetailViewController *controller = (DetailViewController *)[segue destinationViewController];

代替。

请参阅屏幕截图以便更好地理解。

With Size Classes

Without Size Classes