【问题标题】:"unrecognized selector sent to instance" error during performSegueWithIdentifier, using SWRevealViewController使用 SWRevealViewController 在 performSegueWithIdentifier 期间出现“无法识别的选择器发送到实例”错误
【发布时间】:2026-02-05 19:20:13
【问题描述】:

我是 iOS 开发的新手,我正在使用 John Lluch 著名的 SWRevealViewController 实现滑出式菜单。我正在关注这个视频教程:

https://www.youtube.com/watch?v=5SUV1YY2yxQ

到目前为止,我有这个故事板:

初始场景(Reveal View Controller)试图自动触发前两个 segues(到 Table View 和 Navigation Controller)。

当我构建应用程序时,我收到以下错误:

[SWRevealViewController initWithIdentifier:source:destination:]: 无法识别的选择器发送到实例 0x7d96f000

此错误发生在我在下面指出的行中,在 SWRevealViewController.m 中的“loadStoryboardControllers”方法中(这是我在情节提要上的初始“RevealViewController”场景的类)

- (void)loadStoryboardControllers
{
    if ( self.storyboard && _rearViewController == nil )
    {
        //Try each segue separately so it doesn't break prematurely if either Rear or Right views are not used.
        @try
        {
            //**ERROR OCCURS ON FOLLOWING LINE**
            [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil];
        }
        @catch(NSException *exception) {}

        @try
        {
            //**ANOTHER ALMOST IDENTICAL ERROR OCCURS ON FOLLOWING LINE**
            [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil];
        }
        @catch(NSException *exception) {}

        @try
        {
            [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil];
        }
        @catch(NSException *exception) {}
    }
}

发生错误时,'SWSegueRearIdentifier'的值为@"sw_rear",正确。这是我给 segue 的标识符。 SWRevealViewController 的工作方式是它首先查找标识为“sw_rear”的segue,以便自动触发它。

什么可能导致错误,或者我可以做些什么来进一步调试?

【问题讨论】:

  • 方法initWithIdentifier:source:destination:在哪里调用?基本上例外是说SWRevealViewController 类没有实现该方法
  • 我不得不说 try/catch 代码非常难看。最好只调用你知道你将拥有的 segues
  • 我在一个完全不同的类中定义了一个 initWithIdentifier 方法,用于在不同的故事板之间执行转场。我在第一个实例中所做的是通过加载屏幕连接到我的故事板,但是当我调试时,似乎没有调用 initWithIdentifier 方法,我不明白为什么此时会调用它我在哪里得到错误?
  • 您需要查看抛出异常时的堆栈跟踪并找出调用该方法的方法。你的代码认为它应该处理不同的对象类但实际上有SWRevealViewController
  • 不是那个类被调用,而是一些其他代码正在执行认为它正在调用那个类,这就是你得到一个无法识别的选择器的原因

标签: ios objective-c storyboard segue


【解决方案1】:

initWithIdentifier:source:destination:UIStoryboardSegue 类实现的方法。在 segue 操作期间调用它。

在这种情况下,它是针对 UIViewController 子类调用的,导致异常。

在 InterfaceBuilder 中,确保 Segue 的自定义类是有效的 UIStoryboardSegue 子类 - 对于 SWRevealController,它应该是 SWRevealViewControllerSegueSetController

【讨论】:

    最近更新 更多