2015-09-06 91 views
0

我一直在关注这个例子来帮助我建立一个委托,但不幸的是我错过了一些东西,所以它不适合我。 How do I set up a simple delegate to communicate between two view controllers?委托模式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 

然后改变了代码的控制器类,我有以下:

// 
// 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之间建立连接的重要一步。任何人都可以帮我发现它吗?

+0

试图更改属性(弱,非原子)财产(强,非原子) – Andrey

+0

都能跟得上。不起作用 –

+0

更改[strongDelegate HintsViewController:self showFirstLetter:@“firstLetter”]; [self.hintDelegate HintsViewController:self showFirstLetter:@“firstLetter”](其实你不需要在它之前的行) – Andrey

回答

0

假设你有两个文件:一个是你的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; 

而且elseswhere在同一个文件的.m,当你的反应来就叫

[Self.delegate didReceiveData:mDict]; 

在视图控制器文件,你的Alloc初始化的ConnectionManager下课后,其代理设置为自定义和协议方法。正是这些方法,您将从ConnectionManager类获得您的响应。

这是所有协议委托模式