我有一个带有一个表视图的父类。
该类也是该表视图的委托和数据源。
现在我对那个类进行了子类化(派生)并创建了一个子类。
我在子班也有一个表格视图。
然后我在该子类中定义了委托和数据源函数,但它覆盖了父类 tableview 数据源/委托方法。
但我希望他们两个分开。
但是我的要求如下:
我想在搜索栏包含的所有视图控制器的顶部保留一个搜索栏和侧面按钮,在其下方有一个最近的搜索词表。
所以我想为它定义父类,并从该类中子类化其他视图控制器。
我做对了吗?
我有一个带有一个表视图的父类。
该类也是该表视图的委托和数据源。
现在我对那个类进行了子类化(派生)并创建了一个子类。
我在子班也有一个表格视图。
然后我在该子类中定义了委托和数据源函数,但它覆盖了父类 tableview 数据源/委托方法。
但我希望他们两个分开。
但是我的要求如下:
我想在搜索栏包含的所有视图控制器的顶部保留一个搜索栏和侧面按钮,在其下方有一个最近的搜索词表。
所以我想为它定义父类,并从该类中子类化其他视图控制器。
我做对了吗?
我假设您在谈论视图控制器类。如果我理解你的话,那你就要搞砸了。委托是一种避免子类化的方法。当然,您可以将委托子类化 - 没问题。但是您希望超类中的表视图在其视图中拥有一个表。并且您想要一个在其视图中具有另一个表以及超类拥有的表的子类。
这并非不可能。但是从您的子类的角度来看,您的子类拥有两个表视图。即使这样也是可能的。您的视图控制器是两个表的代表(无论它们在视图层次结构中的哪个位置被声明和实例化)。当您现在覆盖委托和数据源方法时,您的子类必须:
两者中哪一个更聪明取决于上下文以及您将要详细实现的目标。
确定调用哪个表的委托的方法可以通过标记表视图(不要使用 0 作为标记)或通过将委托方法的 tableView 参数与相应的属性(在本例中为 IBOutlets)进行比较来完成。(在其他情况下,您可以将 sender 参数与 IBOutlets 进行比较。但是稍后阅读代码时标记可能更容易理解。)
让我们看一个 UITableViewDataSourceDelegate 的例子:
您的超类实现:
@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
(这是从头开始的,没有经过语法检查等。不要指望它会立即正常运行 :)
但是...请重新考虑您的班级结构。恐怕您会迷失在一些相当不合逻辑的类层次结构中。即使没有这个子类化的东西,由一个公共视图控制器管理两个 talbe 也没有错。在每个表都有自己的委托(可以是视图控制器)的视图中使用多个表并没有错。由于 iOS 5(或者它是在 6 中引入的)我们可以为此目的使用 UIContainerView 并在 IB/storyboard 中很好地构建它。
试试这个,
ViewController.h
IBOutlet UITableView *firstTable;
IBOutlet UITableView *secondTable;
视图控制器.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;
}
等等等等……