1

我声明了一个协议方法,以便被它的委托调用。这是相关代码:

协议被声明的视图:

类别视图控制器.h

@class  CategoryViewController;
@protocol CategoryViewControllerDelegate<NSObject>
-(void)loadProductsList:(id)sender;


@end

@interface CategoryViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
{

    id delegate;

}

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

类别视图控制器.m

@implementation CategoryViewController

@synthesize delegate;

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
            CategoryViewController *catView = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
            [self.navigationController pushViewController:catView animated:YES];

            if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
                [self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
            }
    }

委托视图被调用MainViewController,在viewDidLoad的方法中MainViewController,我将委托设置为self:

-(void)viewDidLoad{
    //Use a property of CategoryViewController to set the delegate

    self.categoryController.delegate = self;
}

-(void)loadProductsList:(id)sender{
//Logic


}

让我向您解释一下,CategoryViewController它是由 a 管理的,UINavigationController所以当单击一个单元格时,我会创建一个新实例CategoryViewController并将其推送到导航堆栈。然后我调用协议方法:

if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
  [self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
    }

CategoryViewController问题是,当当前视图为 0 索引时,委托仅对根视图有效。然后委托为空,因此loadProductsList:当我尝试从堆栈视图索引 1、2 等调用它时无法触发协​​议方法。当我返回索引 0(导航堆栈中的根视图)时,委托对象再次有效我可以调用协议方法。

我的问题是:

为什么我在创建新实例CategoryViewController并将其推送到导航堆栈后无法触发协​​议方法?为什么委托对象会为空呢?提前谢谢。

4

1 回答 1

2

您仅为 CategoryViewController 类中的一个(第一个)设置委托。

每次选择一行时,您都在创建一个新的 CategoryViewController 类,其委托为 nil,因为您尚未设置它。

编辑,

我在这里看到两个选项。

a) 您可以将 MainController 设为单例,因此您可以从代码中的任何位置访问它。然后您就可以在 didSelectRowAtIndexPath 中将其设置为委托。

b) 你可以反复通过委托

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        CategoryViewController *catView = [[CategoryViewController alloc] initWithNibName:@"CategoryViewController" bundle:nil];
        [self.navigationController pushViewController:catView animated:YES];

        catView.delegate = self.delegate;

        if([self.delegate respondsToSelector:@selector(loadProductsList:)]){
            [self.delegate loadProductsList:[arrayCategory objectAtIndex:indexPath.row]];
        }
}
于 2013-04-01T15:56:43.087 回答