【问题标题】:Delegate Pattern ios委托模式 ios
【发布时间】:2015-09-06 22:16:49
【问题描述】:

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

我的代码如下所示:

//  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 中的 IBActions 被调用,但是在 gameLogicController 中的任何委托方法中放置断点都不会被命中。所以我错过了设置 GameLogicController 和 HintsViewController 之间连接的重要步骤。谁能帮我看看?

【问题讨论】:

  • 尝试将属性(弱,非原子)更改为属性(强,非原子)
  • 更改 [strongDelegate HintsViewController:self showFirstLetter:@"firstLetter"];到 [self.hintDelegate HintsViewController:self showFirstLetter:@"firstLetter"] (实际上你不需要在它前面加上一行)
  • 就在今天贴了一些简单的delegate代码,大家可以看看:github.com/asaptf/ALAnimatedButtonWithMenu
  • nextRiddle 中,您正在分配一个新的本地HintsViewController 实例并设置委托,但随后您不对其进行任何操作(例如呈现它),因此只要该方法结束提示视图控制器将被释放。您需要在实际呈现在屏幕上的视图控制器实例上设置委托
  • @Paulw11 谢谢。感谢您的回答,我想出了如何解决它。当我实例化 HintsViewController 时,我将委托设置如下: HintsViewController *hintsVC = [storyBoard instantiateViewControllerWithIdentifier:@"hintsViewController"]; hintsVC.hintDelegate = self.controller;

标签: ios objective-c delegates


【解决方案1】:

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

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

@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 类的响应。

这就是协议委托模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多