所以我使用asyncsocket库https://github.com/caydenliew/AsyncSocket。 我有一个按钮,按下时会将字符串发送到服务器。没有错误,但我得到以下异常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-
[key sendData:]: unrecognized selector sent to instance 0x1002f810'
*** First throw call stack:
(0x18ce012 0x16f3e7e 0x19594bd 0x18bdbbc 0x18bd94e 0x3f26 0x1707705 0x63b2c0 0x63b258 0x6fc021 0x6fc57f 0x6fb222 0x66ab1d 0x66af02 0x648d4a 0x63a698 0x26b1df9 0x26b1ad0 0x1843bf5 0x1843962 0x1874bb6 0x1873f44 0x1873e1b 0x26b07e3 0x26b0668 0x637ffc 0x46fd 0x2865 0x1)
libc++abi.dylib: terminate called throwing an exception
这是keyViewController.h
@interface keyViewController ()
{
CFURLRef sysSoundTestPath;
GCDAsyncSocket *asyncSocket;
}
-(IBAction) touchB:(id)sender;
-(IBAction)touchE:(id)sender;
-(void)loadViewFromNIB:(NSString *)nibName owner:(id)owner;
- (void)sendData:(NSString *) dataSend ;
@end
和.m
@implementation keyViewController
- (void)sendData: (NSString *) dataSend {
if (asyncSocket == nil) {
asyncSocket = [(keyAppDelegate *)[[UIApplication sharedApplication] delegate] asyncSocket];
asyncSocket.delegate = self;
}
NSData *data = [dataSend dataUsingEncoding:NSUTF8StringEncoding];
//write data to server
[asyncSocket writeData:data withTimeout:-1 tag:0];
//listen to server for message
[asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:30.0 tag:1];
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
//data from server
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag {
//prepare to read the next message from server again
[asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:30.0 tag:1];
}
- (IBAction)touchB:(id)sender
{
NSLog(@"down");
NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
NSURL* url = [NSURL fileURLWithPath:path];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID( (CFURLRef)objc_unretainedPointer(url), &soundID);
AudioServicesPlaySystemSound(soundID);
[sender transmitHandle];
NSString *name = [sender restorationIdentifier];
[sender sendData:name];
}
- (IBAction)touchE:(id)sender
{
NSLog(@"up");
[sender transmitHandle];
}
-(void)loadViewFromNIB:(NSString *)nibName owner:(id)owner
{
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil];
NSArray *subviews = [objects[0]subviews];
for (UIView *subview in subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
UIButton *key = (UIButton *)subview;
[key addTarget:self action:@selector(touchB:) forControlEvents:UIControlEventTouchDown];
[key addTarget:self action:@selector(touchE:) forControlEvents:UIControlEventTouchUpInside];
//NSString *ident = key.restorationIdentifier;
//NSLog(@"%@",ident);
}
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view setMultipleTouchEnabled:YES];
[self loadViewFromNIB:@"keyViewController" owner:self];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
//Dispose of any resources that can be recreated.
}
@end
我做错了什么???
答案 0 :(得分:0)
IBAction的发件人是按下的按钮。 sendData是控制器的一种方法。您正在将sendData发送到按下的按钮。将发件人更改为自己。我不确定你要发送到发送数据方法的字符串,但我不确定你的按钮是否有属性调用restorationIdentifier。
- (IBAction)touchB:(id)sender
{
NSLog(@"down");
NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
NSURL* url = [NSURL fileURLWithPath:path];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID( (CFURLRef)objc_unretainedPointer(url), &soundID);
AudioServicesPlaySystemSound(soundID);
[sender transmitHandle];
NSString *name = [sender restorationIdentifier];
//I'm not sure what string you're trying to send to the send data method.
NSLog(@"Sending:%@ to sendData method", name);
[self sendData:name];
}