iOS协议/代表混淆?

时间:2013-10-30 10:04:07

标签: ios objective-c

所有这些都是我的第一篇文章,我会尽量精确。我已经阅读了很多关于iOS协议/委托实现的文章,但所有示例都失败了。 让我们说吧 我有A和B控制器,想要从A到B发送数据。 A.H

    @protocol exampleprot <NSObject>
@required
-(void) exampledmethod:(NSString *) e1;
@end

@interface ViewController
{
__weak id <exampleprot> delegate
}

- 上午 在某些程序中 我试着推

[delegate  examplemethod:@"test"]

B.h

@interface test2 : UiViewcontroller <exampleprot>

和B.m实现方法 - (void)exampledmethod:(NSString *)e1;


所以我做错了什么?

3 个答案:

答案 0 :(得分:8)

基本上这是自定义委托的示例,它用于将消息从一个类发送到另一个类。因此,要在另一个类中发送消息,您需要先设置委托,然后在另一个类中使用协议。以下是示例: -

B.h上课

@protocol sampleDelegate <NSObject>
@required
-(NSString *)getDataValue;
@end
@interface BWindowController : NSWindowController
{
    id<sampleDelegate>delegate;
}
@property(nonatomic,assign)id<sampleDelegate>delegate;
@end

B.m班级

- (void)windowDidLoad
{
 //below only calling the method but it is impelmented in AwindowController class
   if([[self delegate]respondsToSelector:@selector(getDataValue)]){
    NSString *str= [[self delegate]getDataValue];
     NSLog(@"Recieved=%@",str);
    }
    [super windowDidLoad];
}

A.h班级

@interface AWindowController : NSWindowController<sampleDelegate> //conforming to the protocol

A.m班级

 //Implementing the protocol method 
    -(NSString*)getDataValue
    {
        NSLog(@"recieved");
        return @"recieved";
    }
//In this method setting delegate AWindowController to BWindowController
    -(void)yourmethod
    {

    BWindowController *b=[[BWindowController alloc]init];
    b.delegate=self;   //here setting the delegate 

    }

答案 1 :(得分:0)

如果要将数据从A发送到B,则应在B中使用返回类型定义委托。在B中,将有代表声明:

@protocol example <NSObject>
@required
-(NSString *) exampleMethod;
@end

然后在A中,实现此方法。在A.m中,您需要

-(NSString *) exampleMethod:(NSString *) e1 {
    // Implementation of this delegate method
    return self.stringYouWantToPassToB
}

然后在B中,您需要做的就是使用该委托从A获得您想要的东西。在B.m,您有

- (void)methodInB {
    // Get string from delegate
    self.string = [self.delegate exampleMethod];
}

答案 2 :(得分:0)

您需要将视图控制器的delegate属性设置为您要将数据发送到的位置=视图控制器到您要发送数据的位置。我认为侯赛因的回答是正确的。你只需要检查你是否采用了正确的方法。