无法识别的选择器从App Delegate发送到实例

时间:2014-01-08 09:57:10

标签: ios iphone objective-c ipad

我正在使用故事板实现我的应用程序。我的应用可以通过自定义网址打开 这是代码

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:        (NSString *)sourceApplication annotation:(id)annotation
{
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
ADMSBarcodeScanner *controller = (ADMSBarcodeScanner*)[mainStoryboard instantiateViewControllerWithIdentifier: @"barcode_scanner"];

controller.delegate =self;
[navigationController pushViewController:controller animated:YES];

return true;
}

写入时会打开视图控制器 ADMSBarcodeScanner.h

@protocol senddataProtocol <NSObject>
-(void)sendDataToHomePage:(NSString *)vin;
@end

@interface ADMSBarcodeScanner : UIViewController < ZBarReaderDelegate >  
{

UIImageView *resultImage;
UITextView *resultText;
UIView *cameraView;
}
@property(nonatomic,assign)id delegate;
@property (nonatomic, retain) IBOutlet UIImageView *resultImage;
@property (nonatomic, retain) IBOutlet UITextView *resultText;
@property (retain, nonatomic) IBOutlet UITextField *resultField;
@property (weak, nonatomic) IBOutlet UIView *cameraView;

@end

相应的.m文件代码是

[delegate sendDataToHomePage:symbol.data];
[reader dismissViewControllerAnimated:YES completion:nil];
[self.navigationController popToRootViewControllerAnimated:YES];

该功能存在于ADMSViewController.m

 -(void)sendDataToHomePage:(NSString *)vin
{
  UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"VIN" message:vin delegate:nil cancelButtonTitle:@"Oke" otherButtonTitles:nil];
[alert show];

 }

请帮我解决这个问题。

这是我得到的错误

2014-01-08 15:49:21.466 Autofunds[2476:907] -[ADMSAppDelegate sendDataToHomePage:]: unrecognized selector sent to instance 0x1cd30580
2014-01-08 15:49:21.478 Autofunds[2476:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ADMSAppDelegate sendDataToHomePage:]: unrecognized selector sent to instance 0x1cd30580'
*** First throw call stack:
(0x32c762a3 0x3a8f697f 0x32c79e07 0x32c78531 0x32bcff68 0xd1eb5 0xe51cb 0xeaaef 0xe2ff5 0x3358d0f5 0x32c4b683 0x32c4aee9 0x32c49cb7 0x32bbcebd 0x32bbcd49 0x3676f2eb 0x34ad2301 0xd14d5 0x3ad2db20)
libc++abi.dylib: terminate called throwing an exception
(lldb) 

5 个答案:

答案 0 :(得分:1)

由于您的委托定义为id,因此这行代码可能会导致此问题:

[delegate sendDataToHomePage:symbol.data];

您需要使用协议更新delegate声明:

@property (nonatomic,assign) id <senddataProtocol> delegate;

您还需要在App Delegate的头文件中声明它实现了协议所需的方法。你的AppDelegate.h应该是这样的:

@interface AppDelegate : UIResponder <UIApplicationDelegate, senddataProtocol>

最后,在AppDelegate.m中实现该方法:

-(void)sendDataToHomePage:(NSString *)vin {
    blah blah...
}

这应该可以解决问题。

答案 1 :(得分:0)

使用您创建的协议声明您的代理

@property(nonatomic,assign)id <senddataProtocol> delegate

答案 2 :(得分:0)

您正在将appDelegate作为ADMSBarcodeScanner的委托并在ADMSViewController.m中实现委托方法。可能是崩溃,因为它没有得到那里的方法实现。 只需在调用任何协议方法之前检查respondToSelector方法。

答案 3 :(得分:0)

您的delegate属性是指AppDelegate个实例。你打电话给[delegate sendDataToHomePage]。并且该方法未在AppDelegate中定义,它位于ADMSViewController中。所以很明显它会随着那条消息而崩溃。

答案 4 :(得分:0)

方法

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

在您设置ADMSAppDelegate的{​​{1}}中,所以当调用controller.delegate = self方法时,它会在sendDataToHomePage而不是ADMSAppDelegate中查找。代码中的ADMSViewControllerself

正如你所说的那样

  

该功能存在于ADMSViewController.m

此方法(函数,如您所称)必须在ADMSAppDelegate中实现,否则它将始终返回此错误。