Ios 如何创建和创建自己处理协议的UITableViewController子类
好的,我正在构建一个定制的TableViewController。其思想是抽象出创建它所需的大多数方法。 我所做的是: LPTableViewController,它继承自UITableViewController,并符合并实现所有TableViewController方法,因此,如果将其指定为故事板中TableViewController的控制器类,则其工作正常。 但真正的想法是像使用自定义控件一样使用它,因此我将创建一个“MainTableViewController”类,该类将挂接在故事板中,并从LPTableViewController继承 当我需要为我的类创建一个自定义协议时,我的问题就出现了,该协议将向LPTableViewController返回一个包含数据的数组来填充TableView。但是我不知道如何以一种有效的方式实现它。以下是我所拥有的: LPTreeView.hIos 如何创建和创建自己处理协议的UITableViewController子类,ios,objective-c,uitableview,delegates,protocols,Ios,Objective C,Uitableview,Delegates,Protocols,好的,我正在构建一个定制的TableViewController。其思想是抽象出创建它所需的大多数方法。 我所做的是: LPTableViewController,它继承自UITableViewController,并符合并实现所有TableViewController方法,因此,如果将其指定为故事板中TableViewController的控制器类,则其工作正常。 但真正的想法是像使用自定义控件一样使用它,因此我将创建一个“MainTableViewController”类,该类将挂接在故事板
@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end
@interface LPTreeView : UITableViewController <LPTreeViewDelegate>
@property (nonatomic, weak) id<LPTreeViewDelegate> delegate;
@end
#import "LPTreeView.h"
@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>
@end
@interface LPTreeViewController : UITableViewController
- (NSArray *)treeViewData;
@end
#import "LPTreeViewController.h"
@interface InheritanceViewController : LPTreeViewController
@end
MainViewController.h
@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end
@interface LPTreeView : UITableViewController <LPTreeViewDelegate>
@property (nonatomic, weak) id<LPTreeViewDelegate> delegate;
@end
#import "LPTreeView.h"
@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>
@end
@interface LPTreeViewController : UITableViewController
- (NSArray *)treeViewData;
@end
#import "LPTreeViewController.h"
@interface InheritanceViewController : LPTreeViewController
@end
无论我尝试什么,我的tableview总是尝试在MainViewController而不是LPTreeView中查找TableViewController强制方法。
谢谢 你完全搞错了
LPTreeView
类重命名为LPTreeViewController
,因为它不是视图李>
LPTreeViewDelegate
协议李>
-(NSArray*)treeViewData方法的声明移动到LPTreeViewController
类
LPTreeViewController
类的viewDidLoad
方法应调用:
self.tableView.delegate = self;
self.tableView.dataSource = self;
InheritanceViewController
类应该扩展LPTreeViewController
,而不是“UIViewController”InheritanceViewController
不应符合协议或具有自己的tableView
属性李>
InheritanceViewController
中的viewDidLoad
应创建LPTreeView
或设置其委托李>
LPTreeViewController.h
@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end
@interface LPTreeView : UITableViewController <LPTreeViewDelegate>
@property (nonatomic, weak) id<LPTreeViewDelegate> delegate;
@end
#import "LPTreeView.h"
@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>
@end
@interface LPTreeViewController : UITableViewController
- (NSArray *)treeViewData;
@end
#import "LPTreeViewController.h"
@interface InheritanceViewController : LPTreeViewController
@end
LPTreeViewController.m
#import "LPTreeView.h"
@implementation LPTreeView
- (void)viewDidLoad {
[super viewDidLoad];
[self populateCurrentData];
}
-(NSArray *)treeViewData {
return @[];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
...
@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" ]},
];
}
#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 {
...
@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" ]},
];
}
继承视图控制器.h
@protocol LPTreeViewDelegate <NSObject>
- (NSArray *)treeViewData;
@end
@interface LPTreeView : UITableViewController <LPTreeViewDelegate>
@property (nonatomic, weak) id<LPTreeViewDelegate> delegate;
@end
#import "LPTreeView.h"
@interface InheritanceViewController : UIViewController <LPTreeViewDelegate>
@end
@interface LPTreeViewController : UITableViewController
- (NSArray *)treeViewData;
@end
#import "LPTreeViewController.h"
@interface InheritanceViewController : LPTreeViewController
@end
InheritanceViewController.m
#import "LPTreeView.h"
@implementation LPTreeView
- (void)viewDidLoad {
[super viewDidLoad];
[self populateCurrentData];
}
-(NSArray *)treeViewData {
return @[];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
...
@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" ]},
];
}
#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 {
...
@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" ]},
];
}
您的前言提到希望使用继承,但您的mainViewController实现似乎使用了组合。我可以从程序员Stack Exchange站点推荐这两种方法的快速比较吗?谢谢你的回答!这对我帮助很大,但没有达到我想要的目的。问题是我想让它与一个UIViewController兼容,而UIViewController内部恰好有一个TableView,这就是我一直在做协议的原因。例如,我可以在一个视图中有一个表视图和一个图像。谢谢