【问题标题】:View Controllers giving an error when creating a segue视图控制器在创建 segue 时出错
【发布时间】:2014-04-05 23:17:44
【问题描述】:

我有一个导航控制器和第一个 VC 模态到第二个很好。我按下ctrl+button 并将其拖过来,一切正常。

我正在从第一个 VC 做第二次 segue(再次),这次是另一个按钮,我是 ctrl+button 并将它拖到新的 VC 中,我在 XCODE 中收到一个 USELESS 错误 -

2014-03-04 11:57:21.340 OutTonight[3173:60b] -[SettingsViewController setDealdetail:]: 无法识别的选择器发送到实例 0x16e686d0 2014-03-04 11:57:21.342 OutTonight[3173:60b] * 终止应用程序到期 未捕获的异常“NSInvalidArgumentException”,原因: '-[SettingsViewController setDealdetail:]: 发送了无法识别的选择器 到实例 0x16e686d0' * 首先抛出调用栈:

这是我的prepareforseguecode

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
      NSIndexPath *indexPath = [self.tableview indexPathForSelectedRow];
      DealViewController *detailView  = (DealViewController *)segue.destinationViewController;
      detailView.dealdetail = [self.allcontent objectAtIndex:indexPath.row];
      detailView.dealpostcode = [self.allpostode objectAtIndex:indexPath.row];
      detailView.dealvenuename = [self.allname objectAtIndex:indexPath.row];
      detailView.dealaddress = [self.alladdress objectAtIndex:indexPath.row];
      detailView.dealaddress2 = [self.alladdress2 objectAtIndex:indexPath.row];
      detailView.deallat = [self.alllat objectAtIndex:indexPath.row];
      detailView.deallng = [self.alllong objectAtIndex:indexPath.row];
      detailView.userlatitude = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserLatitude"];
      detailView.userlongitude = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserLongitude"];
}

有什么想法吗?

【问题讨论】:

  • 你添加了 UIButton 动作方法吗?因为无法识别的选择器意味着它没有关联的操作方法,例如,对于附加到 UITouchupInside 的 UIButton 操作方法。
  • 我还没有对 UIButton 做任何事情,我还没有创建 IBAction 或任何东西 - 虽然这可能是问题?我应该放一个
  • 在我的视图 controller.h 文件中为按钮创建了一个 IBAction,仍然错误
  • 你是否在 secondViewController 中覆盖了 prepareForSegue
  • 你能否为按钮创建一个 IBAction 并在方法调用中调用 [self performSegueWithIdentifier:@"segue identify" sender:self];并且在方法 prepareForSegue 你可以处理同样的事情。

标签: ios objective-c uiviewcontroller storyboard segue


【解决方案1】:

我假设您在 -prepareForSegue: 中为原始 segue 做了一些事情?在这种情况下,您需要确保检查它在-prepareForSegue: 中的哪个segue,并为每个segue 做正确的事情。

编辑:

为了扩展我的答案,我猜你正在使用segue.destinationViewController,并在上面调用setDealdetail:。这对于您的初始转场可能效果很好,因为destinationViewController 响应了该消息,但是新转场的目的地没有。您需要检查正在执行哪个 segue。使用 [segue.identifier isEqualToString:MySegueIdentifierString];

编辑2(发布代码后):

好的,您需要检查您的-prepareForSegue: 中正在执行哪个segue。像这样的:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:SegueToDealViewControllerIdentifier]) {
        NSIndexPath *indexPath = [self.tableview indexPathForSelectedRow];
        DealViewController *detailView  = (DealViewController *)segue.destinationViewController;
        detailView.dealdetail = [self.allcontent objectAtIndex:indexPath.row];
        detailView.dealpostcode = [self.allpostode objectAtIndex:indexPath.row];
        detailView.dealvenuename = [self.allname objectAtIndex:indexPath.row];
        detailView.dealaddress = [self.alladdress objectAtIndex:indexPath.row];
        detailView.dealaddress2 = [self.alladdress2 objectAtIndex:indexPath.row];
        detailView.deallat = [self.alllat objectAtIndex:indexPath.row];
        detailView.deallng = [self.alllong objectAtIndex:indexPath.row];
        detailView.userlatitude = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserLatitude"];
        detailView.userlongitude = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserLongitude"];
    }
}

其中SegueToDealViewControllerIdentifier 是原始segue 的segue 标识符。

【讨论】:

  • 我已经为第一个创建了 prepartForSeague,但还没有为第二个创建。我认为它会在没有prepareforseague的情况下转移到VC,因为那只是为了传递变量?对还是错?
  • prepareForSegue 被调用为您执行的任何 segue - 您检查正在执行 segue 的它的实现:[segue.identifier isEqualToString:MySegueIdentifierString];
  • 或许可以发布您的-prepareForSegue: 代码,如果这样更容易?
  • 你的 prepareForSegue 应该是
  • 没问题,很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多