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