我的项目中有很多UITableViewController类。他们有,
由于我不想在每个类中重写所有这些函数,如何创建具有所有这些功能的自定义基类。
我不知道该怎么做?
任何教程链接或一些指导都会有很大帮助。
答案 0 :(得分:3)
您需要遵循OOPS的简单继承概念。
所以这是一个简单的想法。
myCustomTableBase
&在该对话框的UITableViewController
部分中输入SubClass of
。step1
&将其命名为myNewHomeController
&在该对话框的myCustomTableBase
部分中输入SubClass of
。完成此文件后,您可以检查myNewHomeController.h
文件中的继承路径,如下所示:
#import "myCustomTableBase.h"
@interface myNewHomeController : myCustomTableBase
@end
现在由你来决定你如何设计你的基础&随后继承(子类)您的子类。
希望有所帮助。更新代码
请注意:此处的基本电话来自UIviewController
,而不是UITableViewController
BaseViewController.h
@interface btBaseViewController : UIViewController {
UITableViewStyle _tableViewStyle;
UISearchDisplayController *_searchController;
}
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) UISearchBar *searchBar;
-(void)renderPadUI; // should be implemented by derived class
-(void)renderPhoneUI; // should be implemented by derived class
BaseViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
[self renderUI];
}
-(void)renderUI{
// Do any additional setup after loading the view.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
if(IS_IPAD) {
[self renderPadUI];
}else {
[self renderPhoneUI];
}
}
-(void)enableSearchSetUp:(BOOL)show {
_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.bounds.size.width, 0)];
_searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
_searchBar.delegate = self;
_searchBar.placeholder = @"Search any keyword";
[_searchBar sizeToFit];
// Create search controller
_searchController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
_searchController.searchResultsDataSource = self;
_searchController.searchResultsDelegate = self;
_searchController.delegate = self;
// add tableView
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:_tableViewStyle];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
[self.view addSubview:_tableView];
// This is important line
_tableView.tableHeaderView = _searchBar;
}
现在,在此课程的任何派生类中,请说btHomeViewController
btHomeViewController.h
#import "btBaseViewController.h"
@interface btHomeViewController : btBaseViewController
@end
btHomeViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
// you need not to call this method from this class. The base/parent class will invoke this method, as soon as you create the instane of this class.
-(void)renderPhoneUI {
[self enableSearchSetup:YES]; // this will base version
}
另外
请注意,您必须实现-(void)renderPhoneUI
方法,因为基类期望子实现此方法。或者从基地移除它。
您必须实施delegates
& dataSource
& UITableView
UISearchBar
,因为我还没有在基地提供任何实施。如果在基类中实现委托的实现,那么派生类可以引用相同的委托,如果没有在派生类中具体实现的话。
IS_IPAD
是一个自定义宏,用于使用UIDevice
类检测设备版本。搜索它,你会得到它的定义。
这种方法提供了一个代码,它使用基类中的搜索来处理TableView实现。如果你想要tableView&的任何自定义在派生类中搜索栏,然后您可以在特定类的renderPhoneUI
方法中进行自定义。
我建议在基类本身中实现所有delegates
。然后你所有的tableView&搜索,跨应用程序将是一致的。只需使用dataSource
继续播放/更新。
如果您的每个课程的表格视图不同,就cellForRowAtIndexPath
实施而言,请在目标课程中提供cellForRowAtIndexPath
方法的实施。
<强> Here is sample code 强>
我希望我能把更多的东西弄得干干净净。明确。
希望有所帮助。答案 1 :(得分:0)
更好的方法是,创建一个超类Say BaseTableViewController
在此类中实现您的基本功能,并从此类继承其他UITableViewController
类。像
@interface BaseTableViewController : UITableViewController
- (void)doSomething
@end
而且,您的其他UITableViewController类应该像
@interface FirstTableViewController : BaseTableViewController
并致电[super doSomething];