我正在使用一个框架,它有一些我想扩展/修改的委托方法。
我为使用特定于框架的语言道歉,但我的问题不在于框架 - 它与协议和委托的概念有关。
我对这是如何工作有一个非常浅薄的理解,所以如果你忽略框架并且只是帮助我了解大局,那就没问题了。
我的类标题实现了以下协议:
class ConversationListViewController: ATLConversationListViewController,
ATLConversationListViewControllerDelegate, ATLConversationListViewControllerDataSource,
LYRQueryControllerDelegate {...}
在ATLConversationListViewController源文件中,存在以下函数:
- (void)configureCell:(UITableViewCell<ATLConversationPresenting> *)conversationCell atIndexPath:(NSIndexPath *)indexPath
{
LYRConversation *conversation = [self.queryController objectAtIndexPath:indexPath];
[conversationCell presentConversation:conversation];
if (self.displaysAvatarItem) {
if ([self.dataSource respondsToSelector:@selector(conversationListViewController:avatarItemForConversation:)]) {
id<ATLAvatarItem> avatarItem = [self.dataSource conversationListViewController:self avatarItemForConversation:conversation];
[conversationCell updateWithAvatarItem:avatarItem];
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Conversation View Delegate must return an object conforming to the `ATLAvatarItem` protocol." userInfo:nil];
}
}
//other conditions for various other delegate methods
}
我可以在我的ConversationListViewController类中实现这个avatarItemForConversation函数,如下所示:
func conversationListViewController(conversationListViewController:
ATLConversationListViewController!, avatarItemForConversation
conversation: LYRConversation!) -> ATLAvatarItem! {
//implementation goes here
return user as? ATLParticipant
}
我的问题是,当我设置我的头像时,我需要访问特定的UITableViewCell(它实现ATLConversationPresenting协议) - 否则我必须同步从我的数据库下载头像图像,因为我无法明确提及每个单元格委托函数的默认参数。
所以我的问题就是这样:如何扩展委托功能中的可用信息?
在我的例子中,我可以使用对UITableViewCell的引用或当前对话的indexPath。 我只需要一种方法将对话与其所属的单元格相关联。
答案 0 :(得分:1)
我还在开发Layer + Atlas Framework。我有一个解决方案
对于ATLParticipant ......
class ConversationParticipant: ConversationAvatarItem, ATLParticipant {
var firstName: String!
var lastName: String!
var fullName: String!
var participantIdentifier: String!
override init() {
super.init()
}
}
对于ATLAvatarItem ......
class ConversationAvatarItem: NSObject, ATLAvatarItem {
var avatarImageURL: NSURL!
var avatarImage: UIImage!
var avatarInitials: String!
override init() {
super.init()
}
}
如何使用
func conversationListViewController(conversationListViewController: ATLConversationListViewController!, avatarItemForConversation conversation: LYRConversation!) -> ATLAvatarItem! {
let lastUser = ConversationAvatarItem()
lastUser.avatarImage = UIImage(named: "ee.png")
return lastUser
}