在 XML 中找到但在代码中没有找到的 Segue

Posted

技术标签:

【中文标题】在 XML 中找到但在代码中没有找到的 Segue【英文标题】:Segue found in XML but not found in code 【发布时间】:2016-03-09 08:56:43 【问题描述】:

您好,我有一个关于 segue 的问题,我在这里查看了很多帖子,并且很确定我已经正确设置了 segue。这是我的故事板 XML,有两个场景,SplashScreen 和 ViewController。从 XML 中可以看出,Splash Screen 有一个名为“startSegue”的 segue:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6751" systemVersion="14C109" targetRuntime="ios.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6736"/>
    </dependencies>
    <scenes>
        <!--Splash Screen-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController autoresizesArchivedViewToFullSize="NO" automaticallyAdjustsScrollViewInsets="NO" modalTransitionStyle="crossDissolve" id="BYZ-38-t0r" customClass="SplashScreen" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="YHw-QP-f7w"/>
                        <viewControllerLayoutGuide type="bottom" id="2PH-gO-d5q"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="CXr-Vc-KGH">
                        <rect key="frame" x="0.0" y="0.0"  />
                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                    </view>
                    <extendedEdge key="edgesForExtendedLayout"/>
                    <connections>
                        <segue destination="dqe-cT-PeC" kind="push" identifier="startSegue" id="bcv-Eq-8U6"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="306" y="314"/>
        </scene>
        <!--View Controller-->
        <scene sceneID="Pnt-X0-2I5">
            <objects>
                <viewController id="dqe-cT-PeC" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="w8K-7E-bqp"/>
                        <viewControllerLayoutGuide type="bottom" id="Nj4-1u-ozE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="r7Q-nY-3Gv">
                        <rect key="frame" x="0.0" y="0.0"  />
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yAf-Ru-F3U" customClass="PreviewView">
                                <rect key="frame" x="0.0" y="0.0"  />
                                <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
                            </view>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                    </view>
                    <navigationItem key="navigationItem" id="F3Y-vZ-LGa"/>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="n7E-NZ-nYo" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="1021" y="314"/>
        </scene>
    </scenes>
</document>

但是当我调用代码执行 segue 时,它​​出错并说'Receiver () has no segue with identifier 'startSegue''

[self performSegueWithIdentifier: @"startSegue" sender: self];

使用 try-catch 对检查,它与 navigationController 问题无关。

顺便说一句,我在 AppDelegate.m 中使用以下代码设置了 SplashScreen

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    self.viewController = [[SplashScreen alloc] initWithNibName:@"SplashScreen" bundle:nil];

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;

任何提示将不胜感激!

【问题讨论】:

你是否从 SplashScreen 类中调用 performSegueWithIdentifier ? 您的 XML 文件是 Storyboard 文件。要加载初始控制器,您应该使用 [[UIStoryboard storyboardWithName:@"name" bundle:[NSBundle mainBundle]] instantiateInitialViewController]; 谢谢!我没有测试你的建议,下面的答案很好(删除所有初始化代码)谢谢你的帮助! 【参考方案1】:

自从引入 Storyboard 以来,您无需手动创建您的第一个视图控制器。您所要做的就是在项目属性中指定它:

在您的 AppDelegate 中,您现在可以删除您添加的所有初始化代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // The root view controller is already set. 
    return YES;

那么您的代码中发生了什么?以下代码行创建了一个没有任何视图的新 SplashScreen 控制器:

[[SplashScreen alloc] initWithNibName:@"SplashScreen" bundle:nil];

由于 SplashScreen 是 Storyboard 文件而非 Nib/Xib 文件,因此未加载并返回 nil 视图。搜索指定的segue时,由于Storyboard没有正确加载,没有找到。

【讨论】:

感谢您的详细回复!删除所有额外的代码,它工作得很好。我需要做的其余事情是将 SpalshScreen.XIB 元素移动到情节提要,或者在第一个视图控制器中添加一个视图以加载到 XIB 中。谢谢吨! 想要将您已经构建的 xib 加载到情节提要内的视图中的人,您可以检查此视图,但 paul solt youtube.com/watch?v=upGJgEPbQMw

以上是关于在 XML 中找到但在代码中没有找到的 Segue的主要内容,如果未能解决你的问题,请参考以下文章

myEclipse中启动自带tomcat正常,但在其Web Browser中却显示不出tomcat首页,提示无法找到该页面

使用 Swift 在没有情节提要的情况下展开 segue

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

Segue show(push) 没有出现在 Objective C 项目中

Xcode 说没有找到代码签名身份

命名空间在类中找到,但在 aspx 中没有