ios - 不使用自动布局时,PrepareForSege崩溃

标签 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;
    }
}

除了 Storyboard 的XML文件之外,两个项目之间的代码没有任何区别。
blank的 Storyboard:
<?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的 Storyboard:
<?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) 

几乎所有程序都一样,因此也许我不了解 View Controller 的工作原理……我以为自己可以。你知道为什么会这样崩溃吗?

最佳答案

不会发生这种情况,因为是“自动布局”,而是“尺寸类”。
使用Size Classs,您的搜索类型为Show Detail,并指向以DetailViewController作为根 View Controller 的UINavigationController。
当禁用“自动布局”时,默认情况下将禁用“大小类”,并且“显示详细信息”序列会自动转换为直接指向“DetailViewController”而不是UINavigationController的“推”序列。

所以,

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

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

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

代替。

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

With Size Classes

Without Size Classes

关于ios - 不使用自动布局时,PrepareForSege崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435876/

相关文章:

ios - 切片和索引 uitableview

ios - 添加 "Login With Facebook"或其他自定义按钮到 UIAlertController 或 UIAlertView

iphone - CocoaLumberjack - 如何访问设备上的日志文件?

memory-management - 排序真正的大数组有问题吗?

iPhone应用程序崩溃: Assertion failed function evict_glyph_entry_from_strike,文件Fonts/CGFontCache.c

iphone - NSURLConnection缓存持久化

ios - 获取当前行的正确编号(iOS)

ios - 滚动列表时应用程序崩溃

ios - 手机间隙 : Getting a Canvas element to JPG for export?

ios - AFNetworking:按字节范围下载请求(即:仅文件头)