使用协议在swift中编写自定义函数

时间:2015-07-30 19:24:42

标签: ios swift uitableview protocols

我正在使用一个框架,它有一些我想扩展/修改的委托方法。

我为使用特定于框架的语言道歉,但我的问题不在于框架 - 它与协议和委托的概念有关。

我对这是如何工作有一个非常浅薄的理解,所以如果你忽略框架并且只是帮助我了解大局,那就没问题了。

我的类标题实现了以下协议:

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。 我只需要一种方法将对话与其所属的单元格相关联。

1 个答案:

答案 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

}