好的,所以我正在构建一个自定义TableViewController。这个想法是抽象创建它所需的大多数方法。
我所做的是:
LPTableViewController继承自UITableViewController,并遵循并实现所有TableviewControllers方法,因此,如果将其分配为Storyboard中TableViewController的控制器类,则可以正常工作。
但是真正的想法是像自定义控件一样使用它,因此我将创建一个“MainTableViewController”类,该类将挂在情节提要中并从LPTableViewController继承。

当我需要为我的类创建自定义协议时,我的问题就来了,这将向LPTableViewController返回一个数组,其中包含用于填充TableView的数据。但是我不知道如何以一种可行的方式来实现它。这是我所拥有的:

LPTreeView.h

@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end

@interface LPTreeView : UITableViewController <LPTreeViewDelegate>

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

@end

LPTreeView.m
#import "LPTreeView.h"

@implementation LPTreeView


- (void)viewDidLoad {
    [super viewDidLoad];
    [self populateCurrentData];
}


-(NSArray *)treeViewData {
    return @[];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
...

MainViewController.h
#import "LPTreeView.h"

@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>

@end

MainViewController.m
@interface InheritanceViewController ()
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@end

@implementation InheritanceViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    LPTreeView *treeView = [[LPTreeView alloc] init];
    _tableView.dataSource = treeView;
    _tableView.delegate = treeView;

}

-(NSArray *)treeViewData {
    return @[
             @{@"name": @"Data",
               @"image": @"Image",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data2",
               @"image": @"Image-1",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data3",
               @"image": @"Image-2",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             ];
}

无论我尝试什么,我的tableview总是尝试在MainViewController而不是LPTreeView中找到TableViewController强制性方法。
谢谢!

最佳答案

您正在解决所有这些错误。

  • 因为它不是视图,所以将LPTreeView类重命名为LPTreeViewController
  • 摆脱LPTreeViewDelegate协议。
  • - (NSArray *)treeViewData方法的声明移至LPTreeViewController类。
  • viewDidLoad类的LPTreeViewController方法应调用:
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
  • 您的InheritanceViewController类应该扩展LPTreeViewController,而不是UIViewController。
  • InheritanceViewController应该不符合协议或具有自己的tableView属性。
  • viewDidLoad中的
  • InheritanceViewController应该创建LPTreeView或设置其委托。

  • LPTreeViewController.h
    @interface LPTreeViewController : UITableViewController
    
    - (NSArray *)treeViewData;
    
    @end
    

    LPTreeViewController.m
    #import "LPTreeViewController.h"
    
    @implementation LPTreeViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
    
        [self populateCurrentData];
    }
    
    -(NSArray *)treeViewData {
        return @[];
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    ...
    

    InheritanceViewController.h
    #import "LPTreeViewController.h"
    
    @interface InheritanceViewController : LPTreeViewController
    
    @end
    

    InheritanceViewController.m
    @implementation InheritanceViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    -(NSArray *)treeViewData {
        return @[
             @{@"name": @"Data",
               @"image": @"Image",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data2",
               @"image": @"Image-1",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             @{@"name": @"Data3",
               @"image": @"Image-2",
               @"subcategories": @[ @"One", @"Two", @"Three" ]},
             ];
    }
    

    关于ios - 如何创建和UITableViewController子类自己处理协议(protocol),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31081146/

    10-11 17:33