如何创建一个自定义基类,它具有TableView,Search&一些编辑函数,以便其他类可以继承它

时间:2014-04-14 10:08:42

标签: ios iphone uitableview

我的项目中有很多UITableViewController类。他们有,

  • 主要是类似的功能,包括搜索,编辑,拉动刷新。
  • A TableView
  • UISearchBar
  • UISearchDisplayController。

由于我不想在每个类中重写所有这些函数,如何创建具有所有这些功能的自定义基类。

我不知道该怎么做?

任何教程链接或一些指导都会有很大帮助。

2 个答案:

答案 0 :(得分:3)

您需要遵循OOPS的简单继承概念。

所以这是一个简单的想法。

  1. 创建一个新文件,将其命名为myCustomTableBase&在该对话框的UITableViewController部分中输入SubClass of
  2. 现在提供所有与桌面相关的内容和内容。公共方法&这个基类中的对象。
  3. 现在再次创建一个新文件,例如step1&将其命名为myNewHomeController&在该对话框的myCustomTableBase部分中输入SubClass of
  4. 完成此文件后,您可以检查myNewHomeController.h文件中的继承路径,如下所示:

    #import "myCustomTableBase.h"
    @interface myNewHomeController : myCustomTableBase
    @end
    
  5. 现在由你来决定你如何设计你的基础&随后继承(子类)您的子类。

    希望有所帮助。

    更新代码

    请注意:此处的基本电话来自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];