由于发送到 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
无法在导航中推送。
由于使用 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
无法在导航中推送。