我正在使用故事板实现我的应用程序。我的应用可以通过自定义网址打开 这是代码
- (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)
答案 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
中查找。代码中的ADMSViewController
是self
。
正如你所说的那样
该功能存在于ADMSViewController.m
中
此方法(函数,如您所称)必须在ADMSAppDelegate
中实现,否则它将始终返回此错误。