我有一个带有一个tableview的父类。
该类也是该tableview的委托和数据源。
现在我将该类子类化(派生)并创建了一个子类。
我也在子类中有一个tableview。
然后我在该子类中定义了委托和数据源函数,但它覆盖了父类tableview数据源/委托方法。
但我希望他们俩分开。
但是我的要求如下:
我想在搜索栏包含的所有viewController的顶部保留一个搜索栏和侧边按钮,下面是最近的搜索字词表。
所以我想为它定义父类,并从该类继承其他viewControllers。
我是以正确的方式做的吗?
答案 0 :(得分:2)
我假设你在谈论一个视图控制器类。如果我理解你的话,那么你就要搞砸了。委派是一种避免子类化的方法。当然你可以继承委托 - 没问题。但是,您希望超类中的表视图在其视图中拥有一个表。并且您希望子类在其视图中具有另一个表以及超类拥有的表。
这不是不可能的。但是从您的子类的角度来看,您的子类拥有两个表视图。即使这是可能的。您的视图控制器是两个表的委托(无论它们在视图层次结构中的哪个位置被声明和实例化)。当您现在覆盖委托和数据源方法时,您的子类必须:
两者中哪一个更聪明取决于背景以及您将要实现的细节。
确定哪个表的委托被调用的方法可以通过标记表视图(不要使用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;
}
等等......