Objective c 目标C协议委托测试
我正在用一个例子学习协议和代理!当我尝试重新创建此示例时,我注意到此条件未得到遵守: 如果([delegate respondsToSelector:@selector(amountered:)]){blabla} 错在哪里?脚本: 第一视图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
#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];
}
...