首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >委派模式ios

委派模式ios
EN

Stack Overflow用户
提问于 2015-09-07 06:16:49
回答 1查看 82关注 0票数 0

我一直在遵循这个例子来帮助我构建一个委托,但不幸的是,我遗漏了一些东西,所以它对我不起作用。How do I set up a simple delegate to communicate between two view controllers?

我的代码如下所示:

代码语言:javascript
复制
//  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

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

代码语言:javascript
复制
- (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

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

代码语言:javascript
复制
//
//  GameLogicController.h

#import "HintsViewController.h"

@interface GameLogicController : NSObject < HintDelegateProtocol>

@end

在实现中,我有以下几点:

代码语言:javascript
复制
//  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中的IBActions正在被调用,但是在gameLogicController中的任何委托方法中放置断点都不会被命中。因此,在设置GameLogicController和HintsViewController之间的连接时,我错过了重要的一步。有人能帮我找出来吗?

EN

回答 1

Stack Overflow用户

发布于 2015-09-07 11:21:10

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

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

代码语言:javascript
复制
@protocol ConnManagerDelegate<NSObject>

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

@end

@interface ConnectionManager : NSObject<NSURLConnectionDelegate>

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

和same在同一个文件.m中,当您的响应到来时,只需调用

代码语言:javascript
复制
[Self.delegate didReceiveData:mDict];

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

这是所有协议委派模式

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32428832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档