澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

Swift创造四个抉择题库分界面,0与融云IMKIT开辟难

 原官方网站文书档案方案如下,在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:融云的归类(简要介绍)

斯威夫特创设一个增选题库分界面(消除TableViewCell中Button的selected状态混乱和手势事件被截拦难点)-1

这是因为swift3.0 有无数改观,要求转移下onSelectedTableRow参数。

[self way];

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

IM基特 是融云 SDK 的着力特色之一。融云将即时通信产品中最复杂的对话列表、聊天窗口、音讯内容呈现、会话设置等职能封装为组件,通过简单的代码,就可以间接将以上分界面集成到App 产品中,省去大批量的花费调节和测试时间。融云同一时间扶助规范最丰盛的自定义分界面组件功效,我们得以本着本人分界面要求自由设计开辟。

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

   //重写RCConversationListViewController的onSelectedTableRow事件

return YES;

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

IMLib 是不含界面包车型地铁基础 IM 通信才干库,封装了通讯技巧和对话、音信等对象。引用到 App 工程中后,需求本身落成 UI 分界面,绝对较轻量,适用于对 UI 有较高订制供给的开垦者。

斯威夫特成立多个增选题库界面(化解TableViewCell中Button的selected状态混乱和手势事件被截拦难点)-3

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

点击列表 承继HighlanderCConversationViewController

-(void)way

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

CallKit 是融云音录制通话作用的 UI 分界面 SDK。(基于罗恩gCloud CallLib)包含了单人、五人音摄像通话的分界面包车型客车种种情况和法力。可以异常快的集成 Call基特 来促成增加的音摄像通话界面,并拓展 UI 定制开拓。同不经常常候开源了 CallKit,您能够凭借你的急需去行使。

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

        //展开会话分界面

{

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

图片 1

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

[[RCIM sharedRCIM] initWithAppKey:@"qd46yzrfqdi6f"]Swift创造四个抉择题库分界面,0与融云IMKIT开辟难点。;

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 :登入前所需做的业务(首借使中华VCIM 这么些单例类的一对方法 用来安装某个全局变量)

//全局的导航按键字体颜色

[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:承继大概运维TucsonCConversationListViewController那么些调整器就能够展开聊天列表

 //创造试图 直接跳转

 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:承袭可能运行奥迪Q7CConversationViewController那个页面就能够张开聊天页面

//新建一个聊天会话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逻辑,须求太多满意不断)。所以那八个着力数据的蕴藏,突显和跟新落就自然的高达了大家应用程式本人随身(包含后期产品必要自定义UI数据的显得 ,—后边那几个难题涉及到自定义聊天列表了,不在这里研商了)。

所以在willDisplayCell做这个事情而不是停放cellForRowAtIndexPath中是因为在将展现cell从前就把相应的业务管理了,会更通畅

    {

//token过期恐怕不得法。

2.2:化解方案

上边难题的源于是头像和姓名这一个数量从哪个地方来? 显著必须用接口从大家友好服务器去赢得 ,可是考虑到不可能反复呼吁接口调一样数据 ,所以应用软件必须创设数据库,把宗旨新闻存款和储蓄到地面。为了方便管理和充实可读性,在品种中小编创造WM奥迪Q5CDataManager文件来管理数据存款和储蓄难点。(其实融云本地是做了团结的数据库,可是不提需求给大家方法。)

单例类的创设

(WMRCDataManager *) shareManager;

 //userInfoDataSource的代办回调

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

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

图片 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 是在后续LANDCConversationListViewController视图的基础上制造的。这里有希望您会问:为啥不和谐写二个分界面,不合併他们的分界面?原因如下:固然咱们的视图展现改换了,但是还是需求选拔这么些分界面包车型大巴基础代谢逻辑(相对来说,工作量小,效用高)。

自定义列表cell要求调用下边多少个主意

 将要加载列表数据源的回调,那么些法子很必假设贰个转变数据类型的效果,起桥接功用

@param dataSource  将在加载的列表数据源(成分为安德拉CConversationModel对象)

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

@discussion 您能够在回调中期维修改、增添、删除数据源的要平昔定制呈现的源委,会话列表会依照你回到的改造后的数据源进行展现。

数据源中存放的因素为会话Cell的数据模型,即SportageCConversationModel对象。

-(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上的控件赋值。(这里的数目从哪儿来?)今年就从头调用WMENVISIONCDataManager 类的getUserInfoWithUserId那个艺术从地点获取数据,(这里当地假如未有数量,小编会从劳动接口去拿,然后缓存到本地,那样就无须么一遍都调用接口,给服务端怎成压力了。)

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

3.1.4:数据突显完了,大家直接调用heightForRowAtIndexPath的措施把cell的高呈现出来。

3.1.5:commit艾德itingStyle用来左滑删除单个会话列表的,这里有三种删除意思:1:从列表中除去那个记录,然则聊天音信并不删除仍然在地方存款和储蓄。

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

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

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

自此自定义聊天列表已经依照须求满意大家微脉的供给。

3.2:聊天页面UI的自定义

这一块项目上一时还未完结。专断已经走通了轻便音信的自定义。

3.2.1自定义音信类—WMPRADOCRichMessage 必须再而三与中华VCMessageContent 。那样这一条音信才会储并计入未读音讯数。

//声美素佳儿(Friso)个注明

#define    WMRCRichMessageTypeIdentifier @"RCD:WMRichMsg"

3.2.2 在融云注册在此以前先注册音讯类型(表明此类的留存)

// 注册自定义测试消息 是音讯类型

//RCDTestMessage

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

3.2.3自定义cell—WM翼虎CRichMessageCell 必须承袭与大切诺基CMessageCell 。那样那cell技术呈现用户消息和内容的音讯。而且那类cell在注册时候必须和汉兰达CDTestMessage音信进行绑定。如下:

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

3.2.4参谋聊天列表页面UI的自定义 达成以下多个措施

挂号自定义音讯的Cell

@param cellClass  自定义音信的类,该自定义音讯供给后续于福特ExplorerCMessageContent

@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 自定义音讯一经必要体现,则必须先通过逍客CIM的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 自定义音信一经急需出示,则必须先经过汉兰达CIM的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);

}

客服分界面,承袭 中华VCConversationListViewController

[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];

}

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:Swift创造四个抉择题库分界面,0与融云IMKIT开辟难