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

时间:2012-11-26 15:35:54

标签: ios5 protocols

我只为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

这是Parent Header文件: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推荐的编辑版

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

QuoteSelections.h

@protocol myDelegate

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

@end


@interface QuoteSelections : UITableViewController<UITableViewDataSource, UITableViewDelegate>
{

}


@property (assign) id<myDelegate> myDelegate;

QuoteSelections.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)

任何想法为什么?其他一切看起来都不错。

我也在使用故事板!

1 个答案:

答案 0 :(得分:0)

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

变化

@property (assign) id<myDelegate> delegate;

@property (assign) id<myDelegate> myDelegate;

并且在所有其他地方也会改变。