編輯爲包含代碼。在目標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。
感謝您通過這一混亂的代碼工作。我相信我錯過了一些明顯的東西!
是的,當然可以,「委託」不是語言功能,它只是一種設計模式,您可以按照自己想要的方式創建它們,包括雙向。 – luk2302
這是絕對可能的。但是讓它變弱,因爲你知道。其他保留週期將發生 –
謝謝,這就是我的想法。我正在編寫代碼示例,謝謝。 – user938797