gpt4 book ai didi

ios - 重写 Tableview 数据源/委托(delegate)方法

转载 作者:行者123 更新时间:2023-11-29 11:02:43 29 4
gpt4 key购买 nike

我有一个父类和一个 tableview。

该类也是该 TableView 的委托(delegate)和数据源。

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

我在子类(class)也有一个 tableview。

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

但我希望它们是分开的。

但是我的要求如下:

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

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

我的做法是否正确?

最佳答案

我假设您在谈论 View Controller 类。如果我对你的理解是正确的,那么你就要搞砸了。委托(delegate)是避免子类化的一种方式。当然,您可以将委托(delegate)子类化——没问题。但是你想要父类(super class)中的 TableView 在其 View 中拥有一个表。你想要一个在其 View 中有另一个表的子类加上父类(super class)拥有的表。

这并非不可能。但是从你的子类的角度来看,你的子类拥有两个 TableView 。即使那样也是可能的。您的 View Controller 是两个表的委托(delegate)(无论它们在 View 层次结构中的哪个位置声明和实例化)。当您现在覆盖委托(delegate)和数据源方法时,您的子类必须:

  1. 确定它正在处理/从哪个表调用。然后适本地服务两个表。
  2. 确定它正在处理/被调用的表。然后适本地提供“它自己的”表并调用 [super sameMehtod:withSamePamaters] 以确保 superclas 仍然可以提供数据和服务器作为委托(delegate)。

两者中哪一个更聪明取决于具体情况以及您要实现的具体目标。

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

让我们看一个 UITableViewDataSourceDelegat 的例子:

您的父类(super class)实现:

@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

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

但是...请重新考虑您的类(class)结构。恐怕您会迷失在一些相当不合逻辑的类层次结构中。即使没有这个子类化的东西,让两个表由一个公共(public) View Controller 管理也没有错。在每个表都有自己的委托(delegate)(可以是 View Controller )的 View 中使用多个表并没有错。自 iOS 5(或者它是在 6 中引入的)以来,我们可以为此目的使用 UIContainerView 并在 IB/storyboard 中很好地构建它。

关于ios - 重写 Tableview 数据源/委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15135972/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com