我正在Xcode中创建一个应用程序,并遇到一些问题。我正在使用GameKit框架来允许两个iOS设备之间的蓝牙通信。设置应用程序,使其中一个设备为“主设备”,另一个设备为“从设备”,根据从“主设备”接收的数据更改其屏幕内容。用户可以选择是主服务器还是从服务器,并且在做出该选择时,另一个设备自动成为相反的角色。这一切都在一个视图控制器类中完成。选择角色后,会将子视图添加到baseViewController。
我的问题是,当添加子视图时,我希望能够使用baseViewController类中的方法发送数据。使用当前设置,调用操作becomeMaster:sender
的设备崩溃。
到目前为止我尝试过的是,
BaseViewController:
-(IBAction)becomeMaster:(id)sender {
[self dataToSend:@"slave"]; //tells peer device to become slave, since this device is master
masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
[masterViewController setBaseViewController:self];
[self.view addSubview:masterViewController.view];
}
-(void)dataToSend:(NSString *)direction {
//—-convert an NSString object to NSData—-
NSData* data;
NSString *str = [NSString stringWithString:direction];
data = [str dataUsingEncoding: NSASCIIStringEncoding];
[self mySendDataToPeers:data];
}
-(void)dataToSend:(NSString *)direction {
//—-convert an NSString object to NSData—-
NSData* data;
NSString *str = [NSString stringWithString:direction];
data = [str dataUsingEncoding: NSASCIIStringEncoding];
[self mySendDataToPeers:data];
}
//----------------------------------------------------------------------------//
- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context {
//—-convert the NSData to NSString—-
NSString* str;
str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
[self useReceivedData:str];
[str release];
}
-(void)useReceivedData:(NSString *)str {
if ([str isEqualToString:@"forward"]) {
[slaveViewController.view setBackgroundColor:[UIColor blackColor]];
}
}
MasterViewController:
-(void)setBaseViewController:(BaseViewController *)bvc {
baseViewController = bvc;
}
-(IBAction)goForward:(id)sender {
actionLabel.text = @"goingForward";
[baseViewController dataToSend:@"forward"];
}
大部分代码都是标准Apple文档/示例的一部分,但我将其包含在内,以便了解逻辑流程。
我认为问题源于becomeMaster:sender
和setBaseViewController:bvc
方法。有人可以帮忙解决吗?非常感谢!
答案 0 :(得分:0)
你得到什么样的崩溃? EXC_BAD_ACCESS
?尝试打开可执行文件参数中的NSZombieEnabled
。很难说可能导致崩溃的原因,但您可以尝试将setBaseViewController:
实施更改为:
-(void)setBaseViewController:(BaseViewController *)bvc {
[self willChangeValueForKey:@"baseViewController"];
[baseViewController autorelease]
baseViewController = [bvc retain];
[self didChangeValueForKey:@"baseViewController"];
}
并将[baseViewController release];
添加到MasterViewController
的{{1}}方法。
请注意,为-dealloc
设置自定义设置器并非完全必要。如果头文件中包含以下属性声明:
baseViewController
您使用@property (nonatomic, retain) BaseViewController *baseViewController;
,已经为您生成了@synthesize baseViewController
方法,内置了键值观察支持。如果您不熟悉Objective-C 2.0属性,我建议您阅读Apple's documentation