覆盖Tableview数据源/委托方法

时间:2013-02-28 12:48:53

标签: ios objective-c uitableview override

我有一个带有一个tableview的父类。

该类也是该tableview的委托和数据源。

现在我将该类子类化(派生)并创建了一个子类。

我也在子类中有一个tableview。

然后我在该子类中定义了委托和数据源函数,但它覆盖了父类tableview数据源/委托方法。

但我希望他们俩分开。

但是我的要求如下:

我想在搜索栏包含的所有viewController的顶部保留一个搜索栏和侧边按钮,下面是最近的搜索字词表。

所以我想为它定义父类,并从该类继承其他viewControllers。

我是以正确的方式做的吗?

2 个答案:

答案 0 :(得分:2)

我假设你在谈论一个视图控制器类。如果我理解你的话,那么你就要搞砸了。委派是一种避免子类化的方法。当然你可以继承委托 - 没问题。但是,您希望超类中的表视图在其视图中拥有一个表。并且您希望子类在其视图中具有另一个表以及超类拥有的表。

这不是不可能的。但是从您的子类的角度来看,您的子类拥有两个表视图。即使这是可能的。您的视图控制器是两个表的委托(无论它们在视图层次结构中的哪个位置被声明和实例化)。当您现在覆盖委托和数据源方法时,您的子类必须:

  1. 确定要处理/调用的表。然后适当地为两个表提供服务。
  2. 确定它正在处理/被调用的表。然后适当地提供“自己的”表并调用[super sameMehtod:withSamePamaters]以确保superclas仍然可以提供数据和服务器作为委托。
  3. 两者中哪一个更聪明取决于背景以及您将要实现的细节。

    确定哪个表的委托被调用的方法可以通过标记表视图(不要使用0作为标记)或通过比较委托方法的tableView参数和相应的属性(在本例中为IBOutlets)来完成。 (在其他情况下,您可以将sender参数与IBOutlets进行比较。但在稍后阅读代码时,标记可能更容易理解。)

    让我们看一下UITableViewDataSourceDelegat的一个例子:

    您的超类实现:

    @interface MySuperTableViewController:UITableViewController <UITableViewDelegate>
    
    // There will be something in here.
    // But it inherits self.tableView from UITableViewController anyway. We leave it with that. 
    
    @end
    
    @implementation MySuperTableViewController
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
      // This method creates or re-uses a cell object and sets its properties accordingly.
    
    }
    
    @end
    

    你的子类:

    @interface MySubTableViewController : MySuperTableViewController // no need to declare the delegate here, it is inherited anyway
    
    @property (weak, nonatomic) IBOutlet UITableView  *mySecondTableView;  // self.table will be used by the superclass already. 
    
    @end
    
    @implementation MySubTableViewController
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    if (tableView == self.table) { // This call refers to the one talbe that is managed by super
         return [super tableView:tableView cellForRowAtIndexPath:indexPath];
    }
    
       // This method now creates or re-uses a cell object and sets its properties accordingly.
       // You may want to check wether tableView == self.mySecondTableView etc.
    }
    
    @end
    

    (这是从头开始,没有语法检查等。不要指望它立即正常运行:)

    但是......请重新考虑你的班级结构。我担心你会迷失在一些非逻辑的阶级层次结构中。即使没有这个子类化的东西,使用公共视图控制器管理两个talbes也没有错。在视图中使用多个表没有任何问题,其中每个表都有自己的委托(可以是视图控制器)。从iOS 5开始(或者它引入了6)我们可以使用UIContainerView来实现这一目的,并在IB / storyboard中很好地构建它。

答案 1 :(得分:0)

试试这个,

ViewController.h

    IBOutlet UITableView *firstTable;
    IBOutlet UITableView *secondTable;

ViewController.m

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
   if (tableView == firstTable) {
       return 1;
    } 
   else if(tableView == secondTable)
   {
      return 1;
   }
return 0;
 }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
if (tableView == firstTable) {
    return [arrItems count];
} else if(tableView == secondTable)
{
    return [arrData count];
}
 return 0;
}

等等......