簡體   English   中英

引用superview的方法

[英]Referencing superview's methods

我正在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方法有關。 誰能幫忙解決? 非常感謝!

您會發生哪種崩潰? EXC_BAD_ACCESS 嘗試在可執行文件的參數中打開NSZombieEnabled 很難說是什么導致崩潰的原因,但是您可以嘗試將setBaseViewController:實現更改為此:

-(void)setBaseViewController:(BaseViewController *)bvc {
    [self willChangeValueForKey:@"baseViewController"];
    [baseViewController autorelease]
    baseViewController = [bvc retain];
    [self didChangeValueForKey:@"baseViewController"];
}

並添加[baseViewController release]; MasterViewController-dealloc方法。

請記住,這不是完全必要有一個定制的setter baseViewController 如果你在你的頭文件中的下列財產申報:

@property (nonatomic, retain) BaseViewController *baseViewController;

然后,您使用@synthesize baseViewController ,已經為您生成了-setBaseViewController:方法,並內置了鍵值觀察支持。如果您不熟悉Objective-C 2.0屬性,建議閱讀Apple的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM