繁体   English   中英

委托模式ios

[英]Delegate Pattern ios

我一直在遵循这个示例来帮助我建立代表,但是不幸的是我错过了一些东西,因此对我不起作用。 如何设置一个简单的委托以在两个视图控制器之间进行通信?

我的代码如下所示:

//  HintsViewController.h

#import <UIKit/UIKit.h>

@protocol HintDelegateProtocol;

@interface HintsViewController : UIViewController

@property (weak, nonatomic) id<HintDelegateProtocol> hintDelegate;

-(IBAction)showFirstLetter:(id)sender
-(IBAction)showHint:(id)sender;
-(IBAction)showAnswer:(id)sender;

@end

@protocol HintDelegateProtocol <NSObject>

-(void)HintsViewController:(HintsViewController*)hintsViewController
                showFirstLetter:(NSString*)firstLetter;


-(void)HintsViewController:(HintsViewController*)hintsViewController
           showHint:(NSString*)hint;


-(void)HintsViewController:(HintsViewController*)hintsViewController
           showAnswer:(NSString*)answer;

@end

//
//  HintsViewController.m

#import "HintsViewController.h"

@implementation HintsViewController

#pragma mark -
#pragma mark IBActions

/ *根据以下建议,我在此处更改了代码/ *

- (IBAction)showHint:(id)sender
{
     [self.hintDelegate HintsViewController:self showHint:@"Hint"];
}

- (IBAction)showFirstLetter:(id)sender
{
   [self.hintDelegate HintsViewController:self showFirstLetter:@"FirstLetter"];

}

- (IBAction)showAnswer:(id)sender
{
    [self.hintDelegate HintsViewController:self showAnswer:@"Answer"];
}

@end

然后在Controller类中,我有以下内容:

//
//  GameLogicController.h

#import "HintsViewController.h"

@interface GameLogicController : NSObject < HintDelegateProtocol>

@end

在实现中,我具有以下内容:

//  GameLogicController.m
-(void) nextRiddle 
{
        HintsViewController *hintsViewController = [[HintsViewController alloc] init];
        hintsViewController.hintDelegate = self;
}

#pragma mark -
#pragma mark HintsFunctionality

-(void)HintsViewController:(HintsViewController*)hintsViewController
           showFirstLetter:(NSString*)firstLetter
{
    NSLog(@"Show First Letter called");
}


-(void)HintsViewController:(HintsViewController*)hintsViewController
                  showHint:(NSString*)hint
{
    NSLog(@"show Hint called");
}


-(void)HintsViewController:(HintsViewController*)hintsViewController
                showAnswer:(NSString*)answer
{
     NSLog(@"Show answer called");
}

使用断点,我可以看到正在调用HintsViewController中的IBAction,但是从未在gameLogicController中的任何委托方法中放置断点。 因此,我错过了在GameLogicController和HintsViewController之间建立连接的重要步骤。 谁能帮我发现它?

假设您有两个文件:一个是ViewController,另一个是ConnectionManager类。

在ConnectionManager类中声明协议及其方法,并在ViewController类中定义协议方法。 通过在ViewController类中设置ConnectionManager类的委托,可以调用Protocol方法。

@protocol ConnManagerDelegate<NSObject>

- (void)didReceiveData:(NSDictionary *)data;
- (void)didFailWithError:(NSError*)error;

@end

@interface ConnectionManager : NSObject<NSURLConnectionDelegate>

@property(nonatomic,assign)id< ConnManagerDelegate > delegate;

在同一文件.m中的其他地方,当您的响应出现时,只需调用

[Self.delegate didReceiveData:mDict];

在分配初始化ConnectionManager类后,在ViewController文件中,将其委托设置为self并定义协议方法。 正是这些方法,您将获得ConnectionManager类的响应。

这就是所有协议委托模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM