0

我有两类 UICollectionViewCell - ComicStripViewCellA 和 ComicStripViewCellB。

代替

if (condition) {

     ComicStripViewCellA *comicStripViewCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"comicStripCell" forIndexPath:indexPath];
     comicStripViewCell.imageView.image = image;

     // Common Code Section
     comicStripViewCell.pageNumber.text = @"Something ...";
     .
     .

} else {

     ComicStripViewCellB *comicStripViewCell = [collectionView dequeueReusableCellWithReuseIdentifer:@"comicStripCell" forIndexPath:indexPath];
     comicStripViewCell.title.text = @"Something ...";

     // Common Code Section
     comicStripViewCell.pageNumber.text = @"Something ...";
     .
     .
}

我想优化代码,因为“公共代码部分”中的很多代码都是相同的。这就是我想要实现的目标:

Class myClass;

if (condition) {
     myClass = NSClassFromString(@"ComicStripViewCellA");
} else {
     myClass = NSClassFromString(@"ComicStripViewCellB");
}

myClass *comicStripViewCell = [collectionView dequeueReusableCellWithReuseIdentifer:@"comicStripCell" forIndexPath:indexPath];
comicStripViewCell.title.text = @"Something ...";

// Common Code Section
comicStripViewCell.pageNumber.text = @"Something ...";
.
.

我知道上面的代码不会编译。这只是为了说明我想要实现的目标。有什么方法可以动态地将 ComicStripViewCell 转换为一个类?

提前致谢!


谢谢大家的建议!我使用了@protocol,一切正常。

4

4 回答 4

1

使两个单元格成为定义公共方法的公共父级的子类。然后:

ComicStripViewCellB *comicCell = ...;

或者定义一个@protocol列出常用方法的列表,让单元类公开声明它们实现了协议(@interface ComicStripViewCellB < ComicStripViewCell >)。然后:

UICollectionViewCell < ComicStripViewCellB > *comicCell = ...;
于 2013-05-11T15:26:39.110 回答
1

如果它们具有相同的方法和属性,您可以创建一个它们都实现的协议。或者您可以创建一个继承自UICollectionViewCell通用内容的类,并使您的单元格继承该类。

使用协议:

UICollectionViewCell<MyCellProtocol> *cell;

if (condition) {
    cell = ...
} else {
    cell = ...
}

带有子类:

MyCommonCollectionViewCell *cell;
if (condition) {
    cell = ...
} else {
    cell = ...
}
于 2013-05-11T15:27:30.247 回答
1

如果两个自定义子类具有不在 中的公共属性UICollectionViewCell,那么您应该为它们创建一个新的超类以共享它确实具有这些属性。然后,该comicStripViewCell变量应该是指向该共享超类的指针。

于 2013-05-11T15:27:31.973 回答
1

使用您声明两个类都应实现的必要属性和方法的协议,然后您将能够重构您的公共代码部分。

@protocol Foo <NSObject>

@property (strong, nonatomic) NSString *identifier;

@end

- (void)bar
{
    id <Foo> var = [someObject callMethod];
    var.identifier = @"quirk";
}
于 2013-05-11T15:27:53.797 回答