gpt4 book ai didi

ios - 在 UITableViewCells 的 cellForRowAtIndexPath 方法中实现多态性

转载 作者:可可西里 更新时间:2023-11-01 05:40:49 25 4
gpt4 key购买 nike

我有一个 genericTableViewController - GTBVC - 由当前两个其他 View Controller 进入的类,每个 View Controller 都有自己的数据数组,这些数据数组被传递到这个 GTBVC

目前我的代码是这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
id object = [self.genericArray objectAtIndex:indexPath.row];
NSString *textNameOfObject = [[self.genericArray objectAtIndex:indexPath.row] performSelector:@selector(name)];

#warning - todo: Create a polymorphistic method for each uitableviewcells.

if([object isMemberOfClass:[OXPersonModel class]]){
OXFriendTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableViewCellFriendIdentifier forIndexPath:indexPath];
cell.friendNameLabel.text = textNameOfObject;


[PKQuickMethods setCornerRadiusForView:cell.friendImageView withCornerRadius:CGRectGetWidth(cell.friendImageView.frame)/2];
cell.friendImageView.image = [UIImage imageNamed:@"image"];
[cell.friendImageView setContentMode:UIViewContentModeScaleToFill];
return cell;
}
else if([object isMemberOfClass:[OXTagPlaceCountModel class]]){
OXTagTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableViewCellTagIdentifier forIndexPath:indexPath];
cell.tagNameLabel.text = textNameOfObject;
cell.tagPlacesCountLabel.text = [[self.genericArray objectAtIndex:indexPath.row] performSelector:@selector(totalPlacesCountString)];
return cell;
}
return nil;
}

到目前为止,这个方法还算不错。然而,因为我希望让我的代码在未来具有可扩展性——当我扩展程序以适应其他单元和产品类型时——我需要确保它易于实现。

我想到了多态性。我在想每个 UITableView 子类都需要实现一个通用的方法名称,例如 -[cell updateForModelObject:] 这样最后 cellForRowAtIndexPath 将只有几个代码行。

但我发现自己在想,我仍然需要根据标识符确定哪些单元要出列。要出列的单元格取决于 self.genericArray 中的对象类型。

如何在不使用任何 if 语句的情况下使 cellForRowAtIndexPath 中的当前代码多态?

最佳答案

您所描述的方法通常可以使用协议(protocol)来实现。方法如下:

在您的 GTBVC header 中,声明一个协议(protocol),例如:

@protocol GTBVCCellConfiguration
-(void)updateForModelObject:(id)anObject;
@end

然后创建您的 UITableViewCell 子类,使它们符合该协议(protocol)并让它们实现该方法。在子类中,您可以将“id”参数类型换成您期望的实际数据类型。

由于您的通用 TableView Controller 将处理不同类型的数据,您可以声明一个枚举来指定您的通用 TableView Controller 可以采用的各种模式:

typedef NS_ENUM(NSInteger, GenericTableViewMode) {
case GenericTableViewModePerson,
case GenericTableViewModePlace
};

然后在您的 GTBVC header 中,为该类型声明一个属性:

 @property (assign, nonatomic) GenericTableViewMode tableViewMode

在 feeder view controller 中,导入 GTBVC header 并实现 segue 准备:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:#yourSegueIdentifierForPerson#]) {
((GenericTableViewController *)segue.destinationViewController).mode = GenericTableViewModePerson;
} else {
// check for the next storyboard identifier and set the mode
}
}

然后在您的 cellForRowAtIndexPath 中(使用一些速记):

-(void)tableView:cellForRowAtIndexPath: {
id object = [self.genericArray objectAtIndex:indexPath.row];

UITableViewCell <GTBVCellConfiguration> *cell = nil;

switch (self.mode) {
case GenericTableViewModePerson:
cell = [tableView dequeueResuableCellWithIdentifier:@"PERSON" forIndexPath:indexPath];
case GenericTableViewModePlace:
cell = [tableView dequeueResuableCellWithIdentifier:@"PLACE" forIndexPath:indexPath];
}

[cell updateForModelObject:object];
return cell;
}

如果您愿意,您甚至可以创建一个方法来返回 TableView 当前模式的正确标识符。

关于ios - 在 UITableViewCells 的 cellForRowAtIndexPath 方法中实现多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630658/

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