【发布时间】: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