未从子didSelectRowAtIndexPath调用父协议委派方法



我只为iOS开发了几个月,并在许多场合使用了协议,但我已经被这个问题困扰了几天。

这是我的代码

子标题文件:QuoteSelections.h

@protocol myDelegate
@optional -(void)selectedValueIs:(NSString *)value;   
@end
@interface QuoteSelections : UITableViewController<UITableViewDataSource, UITableViewDelegate> {
}
@property (retain, nonatomic) NSMutableArray *ArrDetails;
@property (assign) id<myDelegate> delegate;
@end

子方法文件:QuoteSelections.m

@implementation QuoteSelections
@synthesize delegate;
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *valueString = @"Test";
[self.delegate selectedValueIs:valueString];
[self.navigationController popViewControllerAnimated:YES]; }

我已经用测试字符串调用了委托方法selectedValueIs

这是父头文件:newQuoteSec.h

@interface newQuoteSec : UITableViewController <myDelegate>  {
QuoteSelections *quoteSelections;  }

这是我的父方法文件:newQuoteSec.m

(void)viewDidLoad {
[super viewDidLoad];
quoteSelections = [[QuoteSelections alloc]init];
quoteSelections.delegate = self; }
(void)selectedValueIs:(NSString *)value {
ddlPurposeOfLoan.text = value; }

我已经在viewDidLoad中设置了子控制器的委托,我认为这应该足以调用我的selectedValueIs方法,但事实并非如此。为什么?


这是Yogesh 推荐的编辑版本

目标是在第二视图控制器中设置所选项目的值,以填充第一视图控制器中的文本字段

报价选择.h

@protocol myDelegate
@optional -(void)selectedValueIs:(NSString *)value;
@end

@interface QuoteSelections : UITableViewController<UITableViewDataSource, UITableViewDelegate>
{
}

@property (assign) id<myDelegate> myDelegate;

报价选择.m

#import "QuoteSelections.h"
@interface QuoteSelections ()
@end
@implementation QuoteSelections
@synthesize myDelegate;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *valueString = @"Test";
[self.myDelegate selectedValueIs:valueString];
[self.navigationController popViewControllerAnimated:YES];
}

newQuoteSec.h

@interface newQuoteSec : UITableViewController <STComboTextDelegate, STDateTextDelegate, JSONRPCServiceDelegate, UITextFieldDelegate, UITableViewDelegate, myDelegate>
{
QuoteSelections *quoteSelections;
}

newQuoteSec.m

- (void)viewDidLoad
{
[super viewDidLoad];
quoteSelections = [[QuoteSelections alloc]init];
quoteSelections.myDelegate = self;
}
-(void)selectedValueIs:(NSString *)value
{
ddlPurposeOfLoan.text = value;
}

编辑。。。

我在代理设置之前插入了NSLog

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *valueString = @"Test";
NSLog(@"Showing the delegate didSelectRowAtIndexPath%@", self.myDelegate);
selectedValue = valueString;
[self.myDelegate selectedValueIs:valueString];
[self.navigationController popViewControllerAnimated:YES];
}

输出窗口显示空

2012-11-27 10:23:59.562 miLoan[18225:c07]显示代理didSelectRowAtIndexPath(null)

有什么想法吗?其他一切看起来都不错。

我也在用故事板!

更改QuoteSelections Controller类中委托的名称,因为它已经有一个委托(UITableViewDelegate)属性。

更改

@property (assign) id<myDelegate> delegate;

@property (assign) id<myDelegate> myDelegate;

在其他地方也会发生变化。

最新更新