Objective c 目标C协议委托测试

Objective c 目标C协议委托测试,objective-c,xcode,delegates,protocols,Objective C,Xcode,Delegates,Protocols,我正在用一个例子学习协议和代理!当我尝试重新创建此示例时,我注意到此条件未得到遵守: 如果([delegate respondsToSelector:@selector(amountered:)]){blabla} 错在哪里?脚本: 第一视图 #import <UIKit/UIKit.h> #import "EnterAmountViewController.h" @interface DelegateExampleViewController : UIViewControl

我正在用一个例子学习协议和代理!当我尝试重新创建此示例时,我注意到此条件未得到遵守:

如果([delegate respondsToSelector:@selector(amountered:)]){blabla}

错在哪里?脚本:

第一视图

 #import <UIKit/UIKit.h>
 #import "EnterAmountViewController.h"

 @interface DelegateExampleViewController : UIViewController  <EnterAmountDelegate>{

 IBOutlet UILabel *amountLabel;
 }

 -(IBAction)changeAmountPressed;

 @end
第二视图

#import <UIKit/UIKit.h>

@protocol EnterAmountDelegate <NSObject>

-(void)amountEntered:(NSInteger)amount;

@end


@interface EnterAmountViewController : UIViewController {

 IBOutlet UITextField *amountTextField;

 id<EnterAmountDelegate> delegate;

 }


-(IBAction)savePressed;

@property(nonatomic,retain) id<EnterAmountDelegate> delegate;

@end
提前谢谢

在方法中:

-(IBAction)changeAmountPressed
{
  EnterAmountViewController * enterAmountVC = [[EnterAmountViewController alloc]init];

  enterAmountVC.delegate = self;
}
您正在堆栈上创建
EnterAmountViewController
的实例作为局部变量。此变量在作用域结束时将不可访问。因此,当您执行
savePressed
时,您是在未设置
delegate
的另一个对象上执行的

换句话说,当你检查

if([delegate respondsToSelector:@selector(amountEntered:)])
它返回NO,因为
委托
为零

设置委托的正确方法是使用
prepareforsgue
机制:

@implementation DelegateExampleViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   [(EnterAmountViewController*)segue.destinationViewController setDelegate:self];
}
...

您不需要
changeAmountPressed
方法或相对绑定。

在firstView.m中,我声明enterAmountVC.delegate=self;这还不够吗?对不起,我听不懂!你能在这里修改这段脚本和过去吗?这样我就可以研究它了?请不要使用代码:您应该在Interface Builder中连接视图控制器。。。我不能粘贴那个。。。或者你没有使用界面生成器?是的,那是一样的。识别表示您的
EnterAmountViewController
的对象;然后显示绑定窗格;您将看到一个
委托
项;单击它旁边的小圆形,然后拖到另一个表示您的
委派ExampleViewController
的对象上,您就完成了。+1表示耐心,因为OP看起来不会很快投票或接受。
if([delegate respondsToSelector:@selector(amountEntered:)])
@implementation DelegateExampleViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   [(EnterAmountViewController*)segue.destinationViewController setDelegate:self];
}
...