您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:0与融云IMKIT开拓难题,聊天分界面

新葡亰496net:0与融云IMKIT开拓难题,聊天分界面

发布时间:2019-07-05 12:57编辑:奥门新萄京娱乐场浏览(95)

     原官方网站文书档案方案如下,在swift3.0的情形下冒出 override func onSelectedTableRow  Method does not override any method from its superclass

    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[ZHUViewController alloc]init]];

     1.1:融云的分类(简单介绍)

    Swift创造八个选项题库分界面(消除TableViewCell中Button的selected状态混乱和手势事件被截拦难题)-1

    那是因为swift3.0 有过多退换,须要改变下onSelectedTableRow参数。

    [self way];

    1.1.1:融云 IM 分界面组件 - 罗恩gCloud IMKit

    IMKit 是融云 SDK 的主干特色之一。融云将即时通信产品中最复杂的对话列表、聊天窗口、音信内容展现、会话设置等作用封装为组件,通过简单的代码,就能够一向将上述分界面集成到App 产品中,省去大量的成本调节和测量检验时间。融云同期援助标准最丰硕的自定义分界面组件效能,大家能够本着本人分界面供给自由设计开采。

    斯威夫特创制二个取舍题库分界面(消除TableViewCell中Button的selected状态混乱和手势事件被截拦难题)-2

       //重写RCConversationListViewController的onSelectedTableRow事件

    return YES;

    1.1.2:融云 IM 通信工夫库 - 罗恩gCloud IMLib

    IMLib 是不含分界面包车型客车底蕴 IM 通信手艺库,封装了通信工夫和对话、音信等目的。引用到 App 工程中后,须求和睦完成 UI 界面,相对较轻量,适用于对 UI 有较高订制需要的开垦者。

    Swift创立贰个抉择题库分界面(解决TableViewCell中Button的selected状态混乱和手势事件被截拦难题)-3

        override func onSelectedTableRow(conversationModelType: RCConversationModelType, conversationModel model: RCConversationModel!, atIndexPath indexPath: NSIndexPath!) {

    点击列表 承接RCConversationViewController

    -(void)way

    1.1.3:融云 Call 分界面组件 - 罗恩gCloud Call基特

    CallKit 是融云音录像通话成效的 UI 分界面 SDK。(基于罗恩gCloud CallLib)包括了单人、五个人音录像通话的分界面包车型客车各个现象和成效。能够高速的集成 CallKit 来兑现增进的音录制通话分界面,并拓展 UI 定制开辟。同一时候开源了 CallKit,您能够依据你的急需去行使。

    第三步:创建UITableViewCell,名为XXWDCell.swift
    将storyboard中的控件关联到XXWDCell.swift中,storyboard中Cell的CustomClass关联到XXWDCell

            //展开会话分界面

    {

    1.1.4:融云 Call 通信技能库 - 罗恩gCloud CallLib

    新葡亰496net 1

            let chat = RCConversationViewController(conversationType: model.conversationType, targetId: model.targetId)

    [[RCIM sharedRCIM] initWithAppKey:@"qd46yzrfqdi6f"];

    1.2:融云 SDK的导入

    持有的选项button和label都分别按顺序关联到optionsBtn和optionsLabel那几个IBOutlet中,并将装有的选项button都涉及到selectAnswerAction这些IBAction中

            chat.title = "想显示的对话题目"

    [[RCIM sharedRCIM] connectWithToken:@"Ddoz6mf/VrWFN1AAb4i5E bFt42 r8 iw8HrsuR8LLmQVFj/48/gjl1hZIgju/d7Pi8ZjtcnWKjidBkoRXEuzA=="  success:^(NSString *userId)

    1.2.1:通过 CocoaPods 导入处理重视库(一般提出选择那几个,不用手动处理注重库,何况进级有助于)

    @IBOutlet weak var backView: UIView!//背景
    @IBOutlet var optionsLabel: [UILabel]!//选项labels
    @IBOutlet weak var titleLabel: UILabel!//题干
    @IBOutlet var optionsBtn: [UIButton]!//选项buttons
    
    @IBAction func selectAnswerAction(sender: UIButton) {
    }```
    然后在drawRect中给backView设置圆角
    

            self.navigationController?.pushViewController(chat, animated: true)

    {

    1.2.2:手动导入 SDK 并本身管理重视库

    override func drawRect(rect: CGRect) {
    backView.layer.cornerRadius = 10
    backView.layer.masksToBounds = true
    }```
    下一场定四个变量model,在写model时,配置cell

        }

    NSLog(@"登入成功。当前报到的用户ID:%@", userId);

    1.3:融云的记名

    var model:Exercise? {
        didSet {
            self.titleLabel.text = model!.title! 
            for i in 0..<4 {
                self.optionsLabel[i].text = model?.options![i] as? String
            }
        }
    }```
    **第四步:创建TableViewController,名为XXWDViewController.swift**
    
    在ViewdidLoad中初始化一些设置
    

    //obj 文件中的定义

    [[RCIM sharedRCIM] setUserInfoDataSource:self];

    1.3.1:登入形式: appKey  从融云开辟者平台创建应用后获取到的App Key,那几个App Key必须和服务端保持一致。不然上面包车型大巴token验证通可是。

    [[RCIM sharedRCIM] initWithAppKey:RONGCLOUNDAPP_KEY]; //开端化融云SDK,在APP起始化的时候必须走那么些艺术。

    //马克: - View生命周期事件
    override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
    self.navigationController?.navigationBar.barTintColor = UIColor(red:227/255, green: 23/255, blue: 13/255, alpha: 1)
    self.tableView.delaysContentTouches = false
    self.tableView.allowsSelection = false
    self.tableView.tableFooterView = UIView()
    }```
    先是供给分析plist文件,定义四个lazy属性dataArray为NSDictionary,因为plist的根项目为Dictionary,并定义三个大局变量xxwdcell,如下:

     - (void)onSelectedTableRow:(RCConversationModelType)conversationModelType

    }

    1.3.2:登入方法:Token令牌登入方式 注:token是从大家和好服务器获取(属于服务与融云的互相)

    [[RCIM sharedRCIM] connectWithToken:loginModel.RongCloudToken success:^(NSString *userId) {

         } error:^(RCConnectErrorCode status) {

             NSLog(@"登录的错误码为:%ld", (long)status);

        } tokenIncorrect:^{

            NSLog(@"token错误");

        }];

    var xxwdcell:XXWDCell!
    //Mark: - 懒加载
    lazy var dataArray:NSDictionary = {
        let path = NSBundle.mainBundle().pathForResource("testLibraryList.plist", ofType: nil)
        return NSDictionary(contentsOfFile: path!)!
    }()```
    然后把单选的题目和多选的题目分别读取到singleChoiceArray和multipleChoiceArray中,因为本项目用到了两个section
    

         conversationModel:(RCConversationModel *)model

    error:^(RCConnectErrorCode status)

    1.3.3 :登陆前所需做的业务(首若是RCIM 那一个单例类的有个别办法 用来安装有些全局变量)

    //全局的领航开关字体颜色

    [RCIM sharedRCIM].globalNavigationBarTintColor = [UIColor blackColor];

    //聊天分界面中展现的头像大小

    '[RCIM sharedRCIM].globalMessagePortraitSize = CGSizeMake(46, 46);

     [RCIM sharedRCIM].globalMessageAvatarStyle = RC_USER_AVATAR_CYCLE;

    //聊天分界面中呈现的头像形状,矩形或许圆形

     [RCIM sharedRCIM].globalConversationAvatarStyle=RC_USER_AVATAR_CYCLE;

    //设置接收音讯代理

     [RCIM sharedRCIM].receiveMessageDelegate=self;

      [RCIM sharedRCIM].userInfoDataSource=self;

    //设置IMKit连接意况的监听器

    [RCIM sharedRCIM].connectionStatusDelegate=self;

    lazy var singleChoiceArray:NSArray = {
    return self.dataArray["单选"]! as! NSArray
    }()```

         atIndexPath:(NSIndexPath *)indexPath;

    {

     1.4:简单达成聊天功用(不涉及职业逻辑和成品须求)

    lazy var multipleChoiceArray:NSArray = {
        return self.dataArray["多选"]! as! NSArray
    }()```
    **配置TableViewDataSource**
    

     

    NSLog(@"登录的错误码为:%d", (int)status);

    1.4.1:承接或然运营RCConversationListViewController那个调节器即可展开聊天列表

     //创制试图 间接跳转

     WMConversationListViewController *recommendNewVC=[[WMConversationListViewController alloc]init];

                //recommendNewVC.xiaoxilx=model.XIAOXILX;

                 [self.navigationController showViewController:recommendNewVC sender:nil];

     //在希图伊始化的时候 设置在列表中须求出示的对话类型 (微脉项目独有单聊)

         [self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),

                                           @(ConversationType_DISCUSSION),

                                             @(ConversationType_CHATROOM),

                                             @(ConversationType_GROUP),

                                             @(ConversationType_APPSERVICE),

                                             @(ConversationType_SYSTEM)]];

    1.4.2:承接可能运行RCConversationViewController那一个页面就可以展开聊天页面

    //新建贰个聊天会话View Controller对象

    RCConversationViewController *chat = [[RCConversationViewController alloc]init];

     //设置会话的门类,如单聊、探究组、群聊、聊天室、客服、公众服务会话等

     chat.conversationType = ConversationType_PRIVATE;

    //设置会话的对象会话ID。(单聊、客服、大伙儿服务会话为对方的ID,钻探组、群聊、聊天室为对话的ID)

     chat.targetId = @"targetIdYouWillChatIn";

     //设置聊天会话分界面要展现的题目

     chat.title = @"想呈现的对话标题";

     //呈现聊天会话分界面

     [self.navigationController pushViewController:chat animated:YES];

    计算:到此地截止,大家就足以达成单纯意义上的兑现聊天成效。

    // Mark: - Table view data source
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return self.dataArray.count
    }
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
    return self.singleChoiceArray.count
    }
    if section == 1 {
    return self.multipleChoiceArray.count
    }
    return 0
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    xxwdcell = tableView.dequeueReusableCellWithIdentifier("XXWDCell") as! XXWDCell
    return xxwdcell
    }```
    配置TableViewDelegate
    在willDisplayCell那个法子中形成了以下几件事情:

    swift3.0  勘误后的

    }

     2:融云集成晋级

    • 1.增添题型和序号,那么些实际能够在plist文件里面做,在此处能够偷懒,直接程序给您搞定,也才那样更费用财富,提出不这么做;
    • 2.给optionsBtn设置了tag,假诺不种种optionsBtn都安装tag的话,将相应不了button的点击事件,还应该有助于将来button状态混乱的管理(忙乱:你在率先个cell中当选了A选项,你会发觉在末端的第4、8个cell中均选中了A选项,不过第4、8个cell并未响应button点击事件
    • 3.给xxwdcell的model赋值

        override func onSelectedTableRow(_ conversationModelType: RCConversationModelType, conversationModel model: RCConversationModel!, at indexPath: IndexPath!)

    tokenIncorrect:^{

     2.1 :遗留难题

    在率先个阶段聊天的时候,你会发觉在闲谈列表分界面只能呈现出未读音信和未读音信的数据以及时光。聊天人的真名和头像却是看不见的。

    由来是因为:融云本身作为IM实现的工具,不做那个数量的传输和封存(测度:1,毕竟需求耗流量,能省则省。2,不加入到app逻辑,需要太多满足不断)。所以这三个宗旨数据的积累,突显和跟新落就自然的到达了我们APP自个儿身上(包蕴早先时期产品必要自定义UI数据的展示,—前面那几个主题素材事关到自定义聊天列表了,不在这里探究了)。

    为此在willDisplayCell做那一个专业并不是停放cellForRowAtIndexPath中是因为在将表现cell以前就把相应的政工管理了,会更通畅

        {

    //token过期恐怕不正确。

    2.2:消除方案

    地点难题的来源于是头像和人名这个数据从哪个地方来? 鲜明必须用接口从大家友好服务器去赢得 ,但是思索到不能够频频呼吁接口调一样数据 ,所以APP必须树立数据库,把中央消息囤积到本地。为了方便管理和充实可读性,在类型中自己创设WMRCDataManager文件来管理数据存储难题。(其实融云本地是做了和谐的数据库,然则不提须要给大家方法。)

    单例类的开创

    (WMRCDataManager *) shareManager;

     //userInfoDataSource的代办回调

    - (void)getUserInfoWithUserId:(NSString*)userId completion:(void (^)(RCUserInfo*))completion;

    微脉数据存款和储蓄机制如图:

    新葡亰496net 2

    微脉数据存款和储蓄机制图

    //Mark: - UITableViewDelegate
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.section == 0 {
            //增加题型和序号,这些其实可以在plist文件里面做
            dict.setDictionary(self.singleChoiceArray[indexPath.row] as! [NSObject : AnyObject])
            dict.setObject("单选", forKey: "type")
            dict.setObject(indexPath.row, forKey: "index")
            //设置选择按钮的tag,防止复用时发生混乱
            for i in 0..<4 {
                xxwdcell.optionsBtn[i].tag = 100   indexPath.row * 4   i
            }
        }
        if indexPath.section == 1 {
            //增加题型和序号,这些其实可以在plist文件里面做
            dict.setDictionary(self.multipleChoiceArray[indexPath.row] as! [NSObject : AnyObject])
            dict.setObject("多选", forKey: "type")
            dict.setObject(indexPath.row, forKey: "index")
            //设置选择按钮的tag,防止复用时发生混乱
            for i in 0..<4 {
                xxwdcell.optionsBtn[i].tag = 1000   indexPath.row * 4   i
            }
        }
        xxwdcell.model = Exercie(dict: dict)
    }```
    设置section头的高度
    

        //

    //要是设置了token保藏期何况token过期,请重新须要你的服务器获取新的token

     2.3:延伸新主题材料

    与上述同类做的破绽:倘若对方刷新新闻,而前者已经缓存了新闻,此时不会重新互连网乞请,导致数据跟新不比时。

    赶尽杀绝方案:遵照斟酌QQ和微信发现她们的数据跟新是在进入聊天页面恐怕查看他们的新闻的时候。所以暂定消除办法是,在每三遍跻身聊天页面时候获得一下对方最新消息。然后跟新鸿基土地资金财产方数据库数据。(缺欠:调用接口的次数依旧广大。从性质上讲不创制。但是大家的成品一时半刻未有那地点的急需,所以没做)

    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 10
    }```
    要促成自适应布局将在总计每四个cell的惊人,思路如下:

        }

    //若无设置token保质期却提醒token错误,请检查你客户端和服务器的appkey是还是不是相称,还恐怕有检查你得到token的流水生产线。

    3:聊天列表UI和聊天UI的自定义

    序言:每贰个产品都有一个谐和风格和要求,所以融云的扯淡列表的UI和聊天详细情况的UI基本上满意不断微脉的须求。这里自定义UI的贯彻就很有至关重要了。

    总中度=标题中度 每种选项label的冲天 各个label的前前面距,每一种选项label的万丈需求通过contentsizeForLabel方法来计量,八个参数size为label的(宽度和最大惊人),注意宽度要减去label的左右侧距,content为label的从头到尾的经过,还只怕有font为字体大小

    NSLog(@"token错误");

     3.1:聊天列表的UI的自定义

    heightForRowAtIndexPath方法中正是依据去内容-总括各种label高度-总括总中度那样的逐条计算的

    }];

    3.1.1:我们项目中聊天列表WMConversationListViewController 是在延续RCConversationListViewController视图的根基上创办的。这里有望您会问:为何不友善写二个分界面,不合併他们的界面?原因如下:固然大家的视图呈现改动了,但是还是须求选择这几个界面包车型地铁刷新逻辑(绝对来讲,职业量小,作用高)。

    自定义列表cell需求调用上边多少个办法

     将要加载列表数据源的回调,那几个方法很必假如二个转换数据类型的成效,起桥接成效

    @param dataSource  就要加载的列表数据源(成分为RCConversationModel对象)

    @return        修改后的数据源(成分为RCConversationModel对象)

    @discussion 您能够在回调中期维修改、加多、删除数据源的成分来定制突显的内容,会话列表会依照你回到的修改后的数据源进行显示。

    数据源中贮存的成分为会话Cell的数据模型,即RCConversationModel对象。

    新葡亰496net:0与融云IMKIT开拓难题,聊天分界面。-(NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource{

    for (int i=0; i<dataSource.count ; i ){

    RCConversationModel *model = dataSource[i];

    if(model.conversationType == ConversationType_PRIVATE){

    // 会话Cell数据模型的显示等级次序 转化为自定义类型

    model.conversationModelType = RC_CONVERSATION_MODEL_TYPE_CUSTOMIZATION;

    }

    }

    return dataSource;

    }

    自定义会话Cell展现时的回调

    -(RCConversationBaseCell *)rcConversationListTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //得到数据源

    RCConversationModel *model = self.conversationListDataSource[indexPath.row];

    //注册cell

    WMRCChatListCell *cell = (WMRCChatListCell *)[[WMRCChatListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"WMRCChatListCell"];

    //中间cell上控件的赋值这里大致

    return cell;

    }

    自定义会话Cell显示时的回调

    -(CGFloat)rcConversationListTableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    //返回cell高度

    return kCellHeight;

    }

    左滑删除自定义会话时的回调

    - (void)rcConversationListTableView:(UITableView *)tableView

    commitEditingStyle:(UITableViewCellEditingStyle)editingStyle

    forRowAtIndexPath:(NSIndexPath *)indexPath {

    '[[RCIMClient sharedRCIMClient] removeConversation:model.conversationType targetId:model.targetId];

    ''  [[RCIMClient sharedRCIMClient]clearMessages:ConversationType_PRIVATE targetId:model.targetId];

    }

    3.1.2:第一个格局很要紧。他是叁个改换的成效,能够把内定的一类消息转变为自定义务消防队息类型。比方:把单聊类型转化为自定义类型。

    3.1.3:然后在cellForRowAtIndexPath方法中一贯,创制cell。然后给cell上的控件赋值。(这里的数额从哪儿来?)今年就起来调用WMRCDataManager 类的getUserInfoWithUserId那些主意从当地获取数据,(这里当地若无多少,小编会从劳动接口去拿,然后缓存到本地,那样就毫无么二遍都调用接口,给服务端怎成压力了。)

    WMRCChatListCell *cell = (WMRCChatListCell *)[[WMRCChatListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"WMRCChatListCell"];

    3.1.4:数据展示完了,大家直接调用heightForRowAtIndexPath的主意把cell的高呈现出来。

    3.1.5:commitEditingStyle用来左滑删除单个会话列表的,这里有二种删除意思:1:从列表中删除这些记录,然而聊天音讯并不删除如故在本土存款和储蓄。

    2:列表删除并把聊天记录一并删除。

    [[RCIMClient sharedRCIMClient] removeConversation:model.conversationType targetId:model.targetId];

    [[RCIMClient sharedRCIMClient]clearMessages:ConversationType_PRIVATE targetId:model.targetId];

    自此自定义聊天列表已经依据供给满足我们微脉的必要。

    3.2:聊天页面UI的自定义

    这一块项目上暂且还未落到实处。专断已经走通了简单音讯的自定义。

    3.2.1自定义音信类—WMRCRichMessage 必须继续与RCMessageContent 。那样这一条音信才会储并计入未读音信数。

    //声Bellamy(Bellamy)个标注

    #define    WMRCRichMessageTypeIdentifier @"RCD:WMRichMsg"

    3.2.2 在融云注册在此以前首先登场记消息类型(注脚此类的留存)

    // 注册自定义测量检验音信 是音信类型

    //RCDTestMessage

     [[RCIM sharedRCIM] registerMessageType:[RCDTestMessage class]];

    3.2.3自定义cell—WMRCRichMessageCell 必须继续与RCMessageCell 。那样那cell技艺显得用户新闻和内容的音信。并且那类cell在注册时候必须和RCDTestMessage音讯进行绑定。如下:

    [self registerClass:[RCDTestMessageCell class] forCellWithReuseIdentifier:RCDTestMessageTypeIdentifier];

    3.2.4参照聊天列表页面UI的自定义 实现以下多少个法子

    注册自定义新闻的Cell

    @param cellClass  自定义音讯的类,该自定义新闻供给后续于RCMessageContent

    @param identifier  自定义新闻Cell的独一标示符

    @discussion 聊天界面在展示时索要通过identifier独一标示来举办Cell重用,以压实品质。

    大家提议您在identifier中增添前缀,请勿使用"rc"前缀的字符串,防止与融云内置音讯的Cell争论。

    - (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;

    自定义务消防队息Cell展现的回调

    @param collectionView  当前CollectionView

    @param indexPath      该Cell对应的音讯Cell数据模型在数据源中的索引值

    @return                自定义音讯须要出示的Cell

    @discussion 自定义新闻一经急需出示,则必须先通过RCIM的registerMessageType:注册该自定义新闻类型,

    并在聊天分界面中通过registerClass:forCellWithReuseIdentifier:注册该自定义务消防队息的Cell,不然将此回调将不会被调用。

    - (RCMessageBaseCell *)rcConversationCollectionView:(UICollectionView *)collectionView

    cellForItemAtIndexPath:(NSIndexPath *)indexPath;

    自定义新闻Cell突显的回调

    @param collectionView          当前CollectionView

    @param collectionViewLayout    当前CollectionView Layout

    @param indexPath              该Cell对应的新闻Cell数据模型在数据源中的索引值

    @return                        自定义音讯Cell须求显示的中度

    @discussion 自定义新闻一经急需体现,则必须先经过RCIM的registerMessageType:注册该自定义新闻类型,

    并在聊天分界面中通过registerClass:forCellWithReuseIdentifier:注册该自定义新闻的Cell,不然将此回调将不会被调用。

    - (CGSize)rcConversationCollectionView:(UICollectionView *)collectionView

    layout:(UICollectionViewLayout *)collectionViewLayout

    sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

    4:总结

    其三方接入,自个儿的难度有限,不过为了满足产品的逻辑去修改第三方的自个儿逻辑是最蛋疼的作业。化解难点的第一是:看文书档案,看官方demo,多尝试。

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath.section == 0 {
            //增加题型和序号,这些其实可以在plist文件里面做
            dict.setDictionary(self.singleChoiceArray[indexPath.row] as! [NSObject : AnyObject])
            dict.setObject("单选", forKey: "type")
            dict.setObject(indexPath.row, forKey: "index")         
        }
        if indexPath.section == 1 {
            //增加题型和序号,这些其实可以在plist文件里面做
            dict.setDictionary(self.multipleChoiceArray[indexPath.row] as! [NSObject : AnyObject])
            dict.setObject("多选", forKey: "type")
            dict.setObject(self.singleChoiceArray.count   indexPath.row, forKey: "index")
        }
        let md:Exercie = Exercie(dict: dict)
        md.title = "(indexPath.row   1)."   "(md.title!)"   "((md.type))"//在标题中增加序号和题型,用来计算准确
    
        //计算label的总高度
        var height = self.contentsizeForLabel(CGSizeMake(screen_width - 26, CGFloat(MAXFLOAT)), content: md.title, font: UIFont.systemFontOfSize(17)).height//减去边界才能计算准确
        for str in md.options! {
            height = height   contentsizeForLabel(CGSizeMake(screen_width - 56,CGFloat(MAXFLOAT)),content:str as! NSString,font:UIFont.boldSystemFontOfSize(17)).height   10//减去边界才能计算准确
        }
        return height   30
    }
    
    //计算Label高度
    private func contentsizeForLabel(size:CGSize,content:NSString,font:UIFont) -> CGSize{
        let options : NSStringDrawingOptions = NSStringDrawingOptions.UsesLineFragmentOrigin
        let size = content.boundingRectWithSize(size, options: options, attributes:  [NSFontAttributeName:font], context: nil).size        
        return size
    }```
    在heightForRowAtIndexPath和willDisplayCell方法中,重复了增加题型和序号的工作和创建model的工作,其实因为heightForRowAtIndexPath方法在willDisplayCell方法之前执行,在heightForRowAtIndexPath创建一个全局变量exercise:Exercise,然后再在willDisplayCell调用就可以了。更改过后看起来就是这样的
    

    }

    var exercise:Exercise!

    - (void)getUserInfoWithUserId:(NSString *)userId

    //Mark: - UITableViewDelegate
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.section == 0 {
    //设置选取开关的tag,制止复用时发出混乱
    for i in 0..<4 {
    xxwdcell.optionsBtn[i].tag = 100 indexPath.row * 4 i
    }
    }
    if indexPath.section == 1 {
    //设置接纳开关的tag,防止复用时发生混乱
    for i in 0..<4 {
    xxwdcell.optionsBtn[i].tag = 1000 indexPath.row * 4 i
    }
    }
    xxwdcell.model = exercise
    }
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if indexPath.section == 0 {
    //增添题型和序号,这一个实际能够在plist文件里面做
    dict.setDictionary(self.singleChoiceArray[indexPath.row] as! [NSObject : AnyObject])
    dict.setObject("单选", forKey: "type")
    dict.setObject(indexPath.row, forKey: "index")
    }
    if indexPath.section == 1 {
    //扩充题型和序号,那一个实际能够在plist文件里面做
    dict.setDictionary(self.multipleChoiceArray[indexPath.row] as! [NSObject : AnyObject])
    dict.setObject("多选", forKey: "type")
    dict.setObject(self.singleChoiceArray.count indexPath.row, forKey: "index")
    }
    exercise = Exercise(dict: dict)
    exercise = "(indexPath.row 1)." "(exercise.title!)" "((exercise.type))"//在标题中加进序号和题型,用来总计标准

    completion:(void (^)(RCUserInfo *userInfo))completion

    //计算label的总高度
    var height = self.contentsizeForLabel(CGSizeMake(screen_width - 26, CGFloat(MAXFLOAT)), content: exercise.title, font: UIFont.systemFontOfSize(17)).height//减去边界才能计算准确
    for str in exercise.options! {
        height = height   contentsizeForLabel(CGSizeMake(screen_width - 56,CGFloat(MAXFLOAT)),content:str as! NSString,font:UIFont.boldSystemFontOfSize(17)).height   10//减去边界才能计算准确
    }
    return height   30
    

    {

    }```
    如此布局就停下,你能够运作一下,看下效果,或有啥错误
    待续......

    if ([userId isEqualToString:@"30000001"])

    {

    RCUserInfo *userInfo = [[RCUserInfo alloc] init];

    userInfo.userId = userId;

    userInfo.name = @"阿辉";

    userInfo.portraitUri = @"";

    return completion(userInfo);

    }

    return completion(nil);

    }

    客服分界面,承接 RCConversationListViewController

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    [self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),

    @(ConversationType_DISCUSSION),

    @(ConversationType_CHATROOM),

    @(ConversationType_GROUP),

    @(ConversationType_APPSERVICE),

    @(ConversationType_SYSTEM)]];

    //设置须求将什么类型的对话在对话列表中聚合显示

    [self setCollectionConversationType:@[@(ConversationType_DISCUSSION),

    @(ConversationType_GROUP)]];

    //重写RCConversationListViewController的onSelectedTableRow事件

    - (void)onSelectedTableRow:(RCConversationModelType)conversationModelType

    conversationModel:(RCConversationModel *)model

    atIndexPath:(NSIndexPath *)indexPath {

    RCConversationViewController *conversationVC = [[RCConversationViewController alloc]init];

    conversationVC.conversationType = model.conversationType;

    conversationVC.targetId = model.targetId;

    conversationVC.title = @"想体现的对话标题";

    [self.navigationController pushViewController:conversationVC animated:YES];

    }

    聊天分界面

    再三再四与//七个调整器#import "LTViewController.h"#import "LTTwoViewController.h"//库#import<RongIMKit/RongIMKit.h>//继承

    #import "RCDCustomerServiceViewController.h"

    //自身写的不二秘技  视图将在可知时调用

    -(void)viewWillAppear:(BOOL)animated

    {

    self.navigationController.navigationBar.hidden = NO;

    }

    //点击聊天分界面

    - (IBAction)LiaoTian:(id)sender {

    RCConversationViewController *chat = [[RCConversationViewController alloc] init];

    //设置会话的花色,如单聊、商量组、群聊、聊天室、客服、民众服务会话等

    chat.conversationType = ConversationType_PRIVATE;

    //设置会话的指标会话ID。(单聊、客服、群众服务会话为对方的ID,研商组、群聊、聊天室为对话的ID)

    chat.targetId = @"30000001";

    //设置聊天会话分界面要呈现的标题

    chat.title = @"想呈现的对话标题";

    //展现聊天会话分界面

    [self.navigationController pushViewController:chat animated:YES];

    }

    //点击列表分界面

    - (IBAction)DianJi:(id)sender {

    LTTwoViewController *lttwo = [[LTTwoViewController alloc] init];

    [self.navigationController pushViewController:lttwo animated:YES];

    }

    //机器人

    - (IBAction)JQR:(id)sender {

    RCDCustomerServiceViewController *chatService = [[RCDCustomerServiceViewController alloc] init];

    #define SERVICE_ID @"KEFU148292606720649"

    chatService.conversationType = ConversationType_CUSTOMERSERVICE;

    chatService.targetId = SERVICE_ID;

    chatService.title = @"客服";

    //chatService.csInfo = csInfo; //用户的详细音讯,此数量用于上传用户新闻到客服后台,数据的nickName和portraitUrl必须填写。(如今该字段一时半刻没用到,客服后台突显的用户音信是您获取token时传的参数,之后会用到)

    [self.navigationController pushViewController :chatService animated:YES];

    }

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:0与融云IMKIT开拓难题,聊天分界面

    关键词: