由于发送到 VC 的选择器无法识别,应用程序崩溃

App crashes due to unrecognized selector sent to VC

由于使用 segue 发送的无法识别的选择器,我的应用程序崩溃了。我知道这是 Whosebug 中的一个常见问题。我尝试了所有解决方案,但无法解决这个问题。我想我错过了什么。我当前的项目抛出此异常,但具有相同代码的新项目不会抛出任何异常。为什么 ?我尝试像下面的代码片段一样使用 segue 将数据从 FirstViewController 传递到 DetailViewController。

在我的 FirstViewController.h 文件中:

 #import <UIKit/UIKit.h>
 #import "DetailViewController.h"

 @interface FirstViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>

 @end

在我的 FirstViewController.m 文件中:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     //if ([segue.identifier isEqualToString:@"detail"]) {
         DetailViewController *vc = (DetailViewController *)[segue destinationViewController];
         vc.nameStr = @"Nuibb";
     //}
 }

在我的 DetailViewController.h 文件中:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController
@property (nonatomic, strong) NSString *nameStr;
@end

在我的 DetailViewController.m 文件中:

#import "DetailViewController.h"

@interface DetailViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;

@end

@implementation DetailViewController
@synthesize nameStr;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.label.text = nameStr;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

我在日志中收到此错误消息 -

2015-03-11 10:27:24.145 bdipo[1185:18722] -[UINavigationController setNameStr:]: unrecognized selector sent to instance 0x7fe928dad8c0
2015-03-11 10:27:24.147 bdipo[1185:18722] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setNameStr:]: unrecognized selector sent to instance 0x7fe928dad8c0'

您可以通过以下方式访问您的视图

DetailViewController *detailVC =
        [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];//modify this identifier name as per your StoryBoardIDentifier for detailview at storyboard..
detailVC.nameStr=@"Nuibb";
[self.navigationController pushViewController:detailVC animated:NO];//if you want to push to detail view from first view

希望对你有所帮助...

V1(segue name = xyz)-->NavController-->(ROOT)VC2

在您的 vc1 的 didselectforRowAtIndexPath 或任何其他 Action 方法中写入此代码。

[self performSegueWithIdentifire:@"xyz"];

然后覆盖方法-

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 if ([segue.identifier isEqualToString:@"xyz"]) {
     DetailViewController *vc = (DetailViewController *)[segue destinationViewController];
     vc.nameStr = @"Nuibb";
 }
}

里面DetailViewController.h先声明一个属性。

@property(nonatomic,strong)NSString *nameStr;

您在任何应用程序中只需要一个导航控制器,它会在启动时加载并为您处理整个视图控制器堆栈。它需要是根视图控制器,并选中 "Is Initial View Controller" 框(在 Attributes Inspector,View Controller 下)以使其开始箭头指向视图的左侧。

假设您的 NewsTVC 是您要显示的第一个视图控制器,请删除情节提要中的导航视图控制器。 Select NewsTVC,转到 XCode 工具栏和 select "Editor --> Embed In --> Navigation Controller"。

将创建一个导航控制器,它会转到您的 NewsTVC。确保 "Is Initial View Controller" 是 selected 用于新的导航控制器,并在 NewsTVC 原型单元格和 DetailVC 之间拖动一个新的 segue。这应该可以组织您的堆栈,以便 segue 正常运行。

tableView didSelectRowAtIndex 上,UINavigationController 根据您的故事板进行了 segued,您的 navigationController 没有任何 属性 命名为 nameStr

您将不得不直接转detailViewController。由于UINavigationController无法在导航中推送。