好的,所以我正在构建一个自定义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/