【问题标题】:Custom delegate method not called未调用自定义委托方法
【发布时间】:2014-12-15 13:34:05
【问题描述】:

我正在尝试将 Apple 的 TableViewUpdates 示例(扩展 TableView 单元格)适应我自己的应用程序,但我似乎无法让它工作。

我试着缩小问题的范围,我想我现在知道问题出在哪里了。

Apple 使用 UITableViewController 作为视图的基本控制器,但我有一个 UIViewController,它具有 UITableViewDelegate 和 DataSource 作为委托方法。我像这样添加了 HeaderViewDelegate:

@interface SearchViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, IngredientHeaderViewDelegate>

IngredientHeaderFooterView.h:

#import <Foundation/Foundation.h>
#include <UIKit/UIKit.h>

@protocol IngredientHeaderViewDelegate;

@interface IngredientHeaderFooterView : UITableViewHeaderFooterView

@property (nonatomic, weak) IBOutlet UILabel *lblTitle;

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

@property (nonatomic) NSInteger section;

- (void)toggleOpenWithUserAction:(BOOL)userAction;

@end

@protocol IngredientHeaderViewDelegate <NSObject>

@property (nonatomic) NSInteger hoi;

@optional
- (void)sectionHeaderView:(IngredientHeaderFooterView *)sectionHeaderView sectionOpened:(NSInteger)section;
- (void)sectionHeaderView:(IngredientHeaderFooterView *)sectionHeaderView sectionClosed:(NSInteger)section;

@end

在 IngredientHeaderFooterView.m 中:

- (void)toggleOpenWithUserAction:(BOOL)userAction {

    if ([self.delegate respondsToSelector:@selector(sectionHeaderView:sectionOpened:)]) {
        NSLog(@"Test1");
        [self.delegate sectionHeaderView:self sectionOpened:self.section];
    }
    if ([self.delegate respondsToSelector:@selector(sectionHeaderView:sectionClosed:)]) {
        NSLog(@"Test2");
        [self.delegate sectionHeaderView:self sectionClosed:self.section];
    }
}

在我实现委托的 UIViewController 中:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

IngredientHeaderFooterView *ingredientHeaderView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:SectionHeaderViewIdentifier];

IngredientDescriptionInfo *ingredientInfo = (self.sectionInfoArray)[section];
ingredientInfo.headerView = ingredientHeaderView;

ingredientHeaderView.lblTitle.text = ingredientInfo.play.name;
ingredientHeaderView.section = section;
ingredientHeaderView.delegate = self;

return ingredientHeaderView;
}

但 respondsToSelector: 总是返回 false。会是什么?

【问题讨论】:

  • 您的视图控制器是否实现了这两种方法?仅仅分配代表是不够的……
  • 是的,当然。我在上面放了一个断点和 NSLog,但它甚至没有超过它。所以这就是为什么我认为它没有被调用。

标签: ios objective-c iphone uitableview delegates


【解决方案1】:

在您的SearchViewController 中,您需要从协议IngredientHeaderViewDelegate 实现这两种方法:

- (void)sectionHeaderView:(IngredientHeaderFooterView *)sectionHeaderView sectionOpened:(NSInteger)section
{
  NSLog(@"section opened");
}

 - (void)sectionHeaderView:(IngredientHeaderFooterView *)sectionHeaderView sectionClosed:(NSInteger)section
{
  NSLog(@"section closed");
}

另外,不要忘记在IngredientHeaderFooterView 中实际分配委托。确保调用 toggleOpenWithUserAction: 时不是 nil

如果您确保方法已实现并且实际分配了delegate,那么您应该很好:)

【讨论】:

  • 我已经实现了这两种方法(当我 cmd+click 时它们也会去声明),但是分配委托是什么意思?
  • 你确定代表不为零吗?如果在toggleOpenWithUserAction: 中设置断点并在调试器控制台中键入:po self.delegate,会返回nil 还是有分配给它的对象?
  • 它是nil。你说我需要在IngredientHeaderFooterView 中分配它,但苹果在它的例子中没有这样做?
  • 好的,至少我们已经确定了您的问题 :) 我将更新我的答案,建议您如何确保分配了您的代表 :)
  • hmm,实际上我认为delegate 为零有点奇怪,因为您实际上是在使用ingredientHeaderView.delegate = self; 创建它之后分配它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2018-11-13
相关资源
最近更新 更多