引用superview的方法

时间:2011-03-28 01:48:46

标签: iphone objective-c

我正在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:sendersetBaseViewController:bvc方法。有人可以帮忙解决吗?非常感谢!

1 个答案:

答案 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