委托方法没有被调用

时间:2015-10-10 05:01:18

标签: ios objective-c delegates

我正在尝试将选定的单元格文本从CategoryViewController传递到DescribeViewController。但是它没有在DescribeViewController方法中调用该方法。

CategoryViewController.h

#import <UIKit/UIKit.h>
@protocol CategoryViewControllerDelegate <NSObject>

- (void)didSelectRow:(NSString *)cellDataString;

@end

@interface CategoryViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) id<CategoryViewControllerDelegate> delegate;

@end

CategoryViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [categoryTableView cellForRowAtIndexPath:indexPath];
    NSString *cellText = cell.textLabel.text;
    [self.delegate didSelectRow:cellText];
    [[self navigationController] popViewControllerAnimated:YES];
}

DescribeViewController.h

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

@interface DescribeViewController : ProductAwareBaseViewController<UITextFieldDelegate, CategoryViewControllerDelegate>

未调用以下didSelectRow方法。我无法找到问题的根源。

DescribeViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.        
    CategoryViewController *popoverTableViewController = [[CategoryViewController alloc] init];
    popoverTableViewController.delegate = self;

}

- (void)didSelectRow:(NSString *)cellDataString
{
    self.cellDataString = cellDataString;
}

ProductAwareBaseViewController.h

@import UIKit;

@class Product;

@interface ProductAwareBaseViewController : UIViewController
@property (nonatomic, strong) Product *product;
@end

ProductAwareBaseViewController.m

#import "ProductAwareBaseViewController.h"
#import "Product.h"

@interface ProductAwareBaseViewController ()

@end

@implementation ProductAwareBaseViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController isKindOfClass:[ProductAwareBaseViewController class]]) {
        ProductAwareBaseViewController *vc = (ProductAwareBaseViewController *)segue.destinationViewController;
        vc.product = self.product;
    }
}
@end

3 个答案:

答案 0 :(得分:0)

@property (nonatomic, weak) id <CategoryViewControllerDelegate> delegate;        

宣布你的代表。

  1. EDITED
  2. 尝试检查委托是否返回一些值。 这样,只要你设置值。

    if(self.delegate && [self.delegate respondsToSelector:@selector(didSelectRow:)])
        {
            [self.delegate didSelectRow:(NSString *) cellDataString];
        }
    

    如果您使用segue在两个控制器之间传输数据,那么请检查代理人。

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    DescribeViewController *obj = (DescribeViewController *)segue.destinationViewController;
    obj.delegate =self;
    }
    

    我认为这会对你有帮助。

答案 1 :(得分:0)

尝试在didSelectRow中设置委托对象。然后在那之后调用该委托方法。因为委托很弱,可能是从记忆中释放出来的。

 IFile file = (IFile) ((IStructuredSelection) wbw.getSelectionService().getSelection()).getFirstElement();

答案 2 :(得分:0)

委托方法未被调用的最常见原因是处理不正确的对象。

  1. 确保从CategoryViewController对象创建 DescribeViewController与您所呈现的相同 屏幕和委托被设置在同一个对象上。我真的相信你正在创建一个新的CategoryViewController对象并设置委托。
  2. DescribeViewController中,在调用委托之前,请检查 委托的存在,它实现了协议方法(如果 它是一个可选的方法)。这是一个安全检查,你也可以放一个NSLog语句来仔细检查你的代表是否存在。你在这里失败了。
  3. - &GT;

    if (delegate && [delegate respondsToSelector:(didSelectRow:)]) {
         [self.delegate didSelectRow:cellText];
    }
    

    PS:如果您从DescribeViewController转到CategoryViewController,则在prepareForSegue:设置委托。

    请遵循以下指南,我相信您可以解决问题!