Ios 委托中的返回值

Ios 委托中的返回值,ios,objective-c,delegates,Ios,Objective C,Delegates,我用协议和初始化方法得到了AudioView类 @protocol AudioViewDelegate <NSObject> - (void)playButtonAction:(id)sender; //(1) - (void)playButtonActionforAudioTrack:(AudioTrack *)audioTrack; //(2) 我用音频轨道初始化类。我有播放按钮,然后我在屏幕上点击它,在方法1的委托中,我得到点击按钮的发送者标签 如何在代理中为播放的曲

我用协议和初始化方法得到了AudioView类

 @protocol AudioViewDelegate <NSObject>
- (void)playButtonAction:(id)sender;  //(1)
- (void)playButtonActionforAudioTrack:(AudioTrack *)audioTrack;   //(2)
我用音频轨道初始化类。我有播放按钮,然后我在屏幕上点击它,在方法1的委托中,我得到点击按钮的发送者标签

如何在代理中为播放的曲目返回audioTrack

========================= 阶级

}

////委派

创建视图

                 for (NSDictionary *dic in audioArray)
    {
        AudioTrack *audioTrack = [[AudioTrack alloc]init];
        audioTrack.artist = dic[@"artist"];
        audioTrack.title = dic[@"title"];
        audioTrack.duration = dic[@"duration"];
        audioTrack.url = dic[@"url"];
        [self.audioArray addObject:audioTrack];

             AudioView *audioView = [[AudioView alloc]initWithFrame:CGRectMake(10, currentHeight + audioInset, 300, 20) forAudioTrack:audioTrack withButtonTag:[audioArray indexOfObject:dic]];
        audioView.delegate = self;
        [view addSubview:audioView];
///执行代表

  - (void)playButtonAction:(id)sender
 {
int audioTag = [sender tag]; //here I get tag of tapped button
AudioTrack *sectedTrack = [self.audioArray objectAtIndex:audioTag]; 

我发现这条路很长。有没有可能我在代表中被点击了音轨?

这并不是一个真正的答案,但我很想发表评论

如果A是一个类,它希望将消息发送给它用作委托的其他类的对象,那么明智的做法是,像您所做的那样,为A希望调用的其他类中的所有方法声明一个协议。 让我们称之为ProtocolA,方法method1和method2。method2接收一个int作为参数。 然后你有任何其他的B类或C类或其他符合协议协议的东西。然后,通常在名为delegate的中有一个id类型的变量。在某个时间点,当您想要发送消息时,您可以调用[self.delegate method1]


这基本上就是委托模式的全部内容。你把playButtonAction叫哪里

我们怎么知道呢。显示实现协议的类和使用委托的类的更多代码。@Hermann Klecker,我添加完整代码code@HermannKlecker,请看我对rmaddy帖子的评论我看不到你对maddy帖子的评论。相反,我从堆栈溢出中得到一条错误消息。那么,您实际上在哪里调用playButtonAction呢?看着它,我有种直觉,你把一个委托和一个视图的动作方法搞混了。然后在UI中,我在delegate runs playButtonAction:中点击这个按钮,我收到自定义视图类的标记。我可以有0-10个此类实例,我需要知道代理中的声音播放。所以,正确的问题是:我有自定义属性A的自定义类。我有这个类的委托VC。我想从委托VC中的委托方法接收属性。如何发送以委派对象?您已经获得标记。显然,您有一个self.audioArray,它为您在tag属性中拥有的给定索引提供曲目。你还需要什么?是的,我很有趣,有没有可能创建一个协议方法,将音频轨迹返回给学员,然后点击按钮?有可能为几乎所有内容创建一个协议方法。这就是协议的目的。我怎么做?我不知道
 - (id)initWithFrame:(CGRect)frame forAudioTrack:(AudioTrack *)audioTrack withButtonTag: (int)buttonTag
 {
self = [super initWithFrame:frame];
if (self) {
    self.frame = frame;
    self.tag = 0011;

    UIImageView *audioImageView = ..
    //[audioView addSubview:audioImageView];

    self.playButton = [UIButton buttonWithType:UIButtonTypeCustom];
    self.playButton.frame = audioImageView.frame;
    self.playButton.tag = buttonTag;
    [self.playButton setBackgroundImage:audioImageView.image forState:UIControlStateNormal];
    [self addSubview:self.playButton];


    [self.playButton addTarget:self.delegate action:@selector(playButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    self.audioTitle = ..
    self.audioTitle.text = [NSString stringWithFormat:@"%@ - %@", audioTrack.artist, audioTrack.title];
    [self addSubview:self.audioTitle];

    self.durationTitle = ..
    [self addSubview:self.durationTitle];


}
return self;
                 for (NSDictionary *dic in audioArray)
    {
        AudioTrack *audioTrack = [[AudioTrack alloc]init];
        audioTrack.artist = dic[@"artist"];
        audioTrack.title = dic[@"title"];
        audioTrack.duration = dic[@"duration"];
        audioTrack.url = dic[@"url"];
        [self.audioArray addObject:audioTrack];

             AudioView *audioView = [[AudioView alloc]initWithFrame:CGRectMake(10, currentHeight + audioInset, 300, 20) forAudioTrack:audioTrack withButtonTag:[audioArray indexOfObject:dic]];
        audioView.delegate = self;
        [view addSubview:audioView];
  - (void)playButtonAction:(id)sender
 {
int audioTag = [sender tag]; //here I get tag of tapped button
AudioTrack *sectedTrack = [self.audioArray objectAtIndex:audioTag];