2017-05-25 94 views
0

編輯爲包含代碼。在目標C中,類A可以是類B的委託,而類B是類A的委託?

目標C中可能有類A是類B的委託,而類B是類A的委託嗎?

我有第一個委託(稱之爲A到B)工作正常。然後我以其他方式實現它,它無法找到委託方法,並帶有經典警告: 協議'SoundpaperViewControllerDelegate'中的方法'audioCueHasMovedDelegateMethod'未實現。

在我花時間上傳代碼之前,請讓我知道這是否可能,我只是做錯了什麼,或者如果它不能工作,我需要使用另一種技術作爲NSNotification。我做了我的谷歌搜索,但無法找到這個問題。

如果這在理論上是合法的,那麼我會上傳我的代碼。

謝謝。

在Objective C中,有可能讓方法A委託給方法B,而方法B是方法A的延遲?
我有第一個委託(稱爲A到B)工作正常。然後我以其他方式實現它,它無法找到委託方法,並帶有經典警告: 協議'SoundpaperViewControllerDelegate'中的方法'audioCueHasMovedDelegateMethod'未實現。

在我花時間上傳代碼之前,請讓我知道這是否可能,我只是做錯了什麼,或者如果它不能工作,我需要使用另一種技術作爲NSNotification。我做了我的谷歌搜索,但無法找到這個問題。 謝謝。 這是A類: A類AudioOperations,它調用B類SoundpaperViewController中的一個方法,名爲setupAudioPlayerControls。這是因爲視圖控制器是與屏幕交談的內容(使用Storyboard)。雖然我想將音頻播放器分成單獨的課程和單獨的文件以保持清潔。 這只是正常

AudioOperations.h

. . . 
@class AudioOperations; 
@class SoundPaperViewController; 


@protocol AudioOperationsDelegate <NSObject> 

- (void) setupAudioPlayerControls; // THIS is called on Class B and works fine 



@end 

@interface AudioOperations : NSObject 

@property (nonatomic, weak) IBOutlet id <AudioOperationsDelegate> delegate; 
. . . 

@end 

簡體AudioOperations.mm

@interface AudioOperations() <AVAudioPlayerDelegate> 

@end 


- (void) audioPlayback // simplified to show what is important 
{ 
    NSLog(@"Entering audioPlayback"); 
    self.audioPlayer.delegate = self; 

     NSLog(@"calling setupaudioplayercontrols from audioPlayback"); 
      [self.delegate setupAudioPlayerControls]; // delegated to soundpaperviewcontroller and works just fine 


    NSLog(@"Exiting audioPlayback"); 
} 


. . . (various other code) 
- (void) audioCueHasMovedDelegateMethod // THIS IS THE method that should be called from Class B but can’t be found (where the warning comes from) 
{ 
    // User has released the cue while inside the control - update the player… 
    NSLog(@"in delegate audioCueHasMoved"); 
    [self.audioPlayer setCurrentTime: self.delegate.audioCueSlider.value]; 

    if (self.audioPlayer.isPlaying == NO) 
    { 
     [self.audioPlayer play]; 
    } 

    // … and go back to updating the control. 

    self.audioTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 
                 target: self 
                selector: @selector(updateAudioTime:) 
                userInfo: nil 
                 repeats: YES]; 
} 

THIS IS B類(再次簡化)

SoundpaperViewController.h 
. . . 

@class LabelProcessor; 
@class AudioOperations; 
@class SpotterGraphicsView; 

@protocol SoundpaperViewControllerDelegate <NSObject> 

- (void) audioCueHasMovedDelegateMethod; // this is the method that should be called but isn’t found 

@end 


@interface SoundPaperViewController : UIViewController<QLPreviewControllerDataSource, QLPreviewControllerDelegate> 

@property (nonatomic, weak) IBOutlet id <SoundpaperViewControllerDelegate> delegate; 

. . . 

@end 


SoundpaperViewController.mm 
. . . (bunch of #imports etc) 
@interface SoundPaperViewController() <AVCaptureVideoDataOutputSampleBufferDelegate 
    ,AVCaptureMetadataOutputObjectsDelegate 
    ,LabelProcessorDelegate 
    ,AudioOperationsDelegate 
    ,SettingsObserver 
    ,CEGuideArrowDelegate 
    ,SoundpaperViewControllerDelegate // NOT SURE THIS IS RIGHT, but I’ve tried it with and without it 
    > 
. . . (bunch of @properties, etc.) 
@implementation SoundPaperViewController // WARNING IS HERE that the method audioCueHasMovedDelegateMethod can’t be found 


- (id) initWithCoder: (NSCoder*) inDecoder 
{ 
    if ((self = [super initWithCoder: inDecoder]) != nil) 
    { 
     NSLog(@"new latestImageCond created NEW"); 
     self.latestImageCondition = [NSCondition new]; 
     NSLog(@"initWithCoder spvc thread: %@", [NSThread currentThread]); 
    } 

    self.delegate = self; // NOTE this 

    return self; 
} 


// This is the delegate method called from CLASS A (AudioOperations) and works just fine: 
- (void) setupAudioPlayerControls 
{ 

    NSLog(@"setupAudioPlayerControls"); 
    // hide the playbutton 
    [self.playButton setEnabled:NO]; 
    [self.playButton setTintColor: [UIColor clearColor]]; // hides it 

. . . etc. 


} 

儘可能接近我可以告訴我在兩個班裏都做了一切一樣的事情我不確定是否在界面中使用這個SoundpaperViewControllerDelegate。

感謝您通過這一混亂的代碼工作。我相信我錯過了一些明顯的東西!

+2

是的,當然可以,「委託」不是語言功能,它只是一種設計模式,您可以按照自己想要的方式創建它們,包括雙向。 – luk2302

+4

這是絕對可能的。但是讓它變弱,因爲你知道。其他保留週期將發生 –

+0

謝謝,這就是我的想法。我正在編寫代碼示例,謝謝。 – user938797

回答

0

在朋友的幫助下,我能夠得到這個工作。對於那些可能有類似問題的人來說,這是一個讓.h文件正確設置的問題:

在SoundpaperViewController中。H:

@class LabelProcessor; 
@class AudioOperations; 
@class SoundPaperViewController; 


@interface SoundPaperViewController : UIViewController < QLPreviewControllerDataSource, QLPreviewControllerDelegate> // note no audioOperationsDelegate in this line 

- (void) setupAudioPlayerControls; 

@property (nonatomic, strong) AudioOperations * SPVdelegate; 

在AudioOperations類:

@class AudioOperations; 
@class SoundPaperViewController; 

@interface AudioOperations : NSObject // note no SoundpaperViewControllerDelegate here 

@property (nonatomic, weak) SoundPaperViewController * audioDelegate; 

- (void) audioCueHasMovedDelegateMethod; 

而在Soundpaper類.m文件:

_myAudio = [[AudioOperations alloc] init]; 
_myAudio.audioDelegate = self; 
self.SPVdelegate = _myAudio; 

這是啓發了我,我沒有需要包括@interface中的委託(例如@interface SoundpaperViewController)擺脫這種情況並簡單地聲明@property就是所需要的。

2

是的,這可以做到。確保每個人都有一個對另一個的弱引用,以便最終不會留下保留週期。

+1

只有一個需要是一個弱引用。如果他們都很弱,那麼其他東西需要擁有_both_。 –

相關問題