IOS实现简易版的QQ下拉列表_IOS

下面我们通过实例代码来一步步看怎么实现, 首先建立了两个模型类, 一个Friend, 一个FriendGroup类. 数据源用的本地的一个plist文件. plist文件中包含了FriendGroup的name,friends数组等属性.

Friend.h 示例代码

#import <Foundation/Foundation.h>

@interface Friend : NSObject
@property (nonatomic, copy) NSString *name;
@end

FriendGroup.h 示例代码

#import <Foundation/Foundation.h>
@interface FriendGroup : NSObject
@property (nonatomic, copy) NSString *name;
// 数组中存放的为Friend类的实例对象
@property (nonatomic, copy) NSMutableArray *friends;
// 用来判断分组是否打开(opened属性正是实现下拉列表的关键)
@property (nonatomic, assign, getter = isOpened) BOOL opened;
// 自定义方法用来赋值
-(void)setFriendGroupDic:(NSMutableDictionary *)dic;
@end

FriendGroup.m 示例代码

#import "FriendGroup.h"
#import "Friend.h"
@implementation FriendGroup

-(void)setFriendGroupDic:(NSMutableDictionary *)dic
{
// 通过字典给FriendGroup的属性赋值
 [self setValuesForKeysWithDictionary:dic];
 NSMutableArray *tempArray = [NSMutableArray array];
// 遍历friends属性数组
 for (NSMutableDictionary *dic in self.friends) {
  Friend *friend = [[Friend alloc] init];
  [friend setValuesForKeysWithDictionary:dic];
  [tempArray addObject:friend];
 }
 //重新对friends属性数组赋值,此时存的都是Friend对象
 self.friends = [NSMutableArray arrayWithArray:tempArray];
}
@end

在ViewController中创建一个tableView

#import "ViewController.h"
#import "SectionView.h"
#import "FriendGroup.h"
#import "Friend.h"
#define kTableViewReuse @"reuse"
@interface ViewController ()<UITableViewDelegate, UITableViewDataSource, SectionViewDelegate>
@property (nonatomic, strong) UITableView *tableView;
// 数组中存放FriendGroup的实例对象
@property (nonatomic, strong) NSMutableArray *allArray;
@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];
 self.allArray =[NSMutableArray array];
 [self creatTableView];
 [self getData];
}

- (void)creatTableView {
 self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
 _tableView.delegate = self;
 _tableView.dataSource = self;
 [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kTableViewReuse];
 [self.view addSubview:_tableView];
}
// 获取数据
- (void)getData {
 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"friends.plist" ofType:nil];
 NSArray *tempArray = [NSArray arrayWithContentsOfFile:filePath];
 for (NSMutableDictionary *dic in tempArray) {
  FriendGroup *friendGroup = [[FriendGroup alloc] init];
  [friendGroup setFriendGroupDic:dic];
  [self.allArray addObject:friendGroup];
 }
 [self.tableView reloadData];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
 return 50;
}
// SectionView必须实现的协议方法
- (void)touchAction:(SectionView *)sectionView {

}
#pragma mark - TableView Delegate
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
 FriendGroup *friendGroup = [self.allArray objectAtIndex:section];
 //放一个封装的view,view上有一个label和imageVIew,自带touch事件,点击触发协议方法
 SectionView *sectionView = [[SectionView alloc] initWithFrame:CGRectMake(0, 0, 375, 50)];
 sectionView.delegate = self;
 sectionView.tag = section + 1000;
 sectionView.textLabel.text = friendGroup.name;
 sectionView.group = friendGroup;
 return sectionView;
}
#pragma mark - TableView DataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 return _allArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 return [_allArray[section] friends].count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableViewReuse];
 FriendGroup *friendGroup = _allArray[indexPath.section];
 Friend *friend = friendGroup.friends[indexPath.row];
 cell.textLabel.text = friend.name;
 return cell;
}
#pragma mark - Memory Waring
- (void)didReceiveMemoryWarning {
 [super didReceiveMemoryWarning];
 // Dispose of any resources that can be recreated.
}

@end

可以从上面代码看到, 创建了一个tableView. 并根据数组个数给分区数量赋值, 然后在tableView: viewForHeaderInSection:方法里, 用一个自定的view给分区头视图赋值. 在tableView: cellForRowAtIndexPath:方法里给每个分区对应的cell进行了赋值. 先看一下效果.

从上图可以看到现在每个分区中对应有不同数量的row,但是还没有实现我们想要的效果.所以再往下继续看.

SectionView.m

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 [self.delegate touchAction:self];
}
/*
 [self.delegate touchAction:self];
 协议方法会刷新tableview,然后会刷新tableview的 viewForHeaderInSection:方法
 就会重新布局SectionView所以会走layoutSubviews方法
 */
-(void)layoutSubviews
{
 [super layoutSubviews];
// 改变imageView的transform属性 点击时有开闭的效果
 [UIView animateWithDuration:0.3 animations:^{
  _imageView.transform = _group.opened ? CGAffineTransformMakeRotation(M_PI_2) : CGAffineTransformMakeRotation(0);
 }];
}

点击SectionView时 就让代理人去执行协议方法,但是在VC的协议方法中什么都没写, 所以需要完善一下

- (void)touchAction:(SectionView *)sectionView {
// 通过前面设置的tag值找到分区的index
 NSInteger index = sectionView.tag - 1000;
 FriendGroup *group = [self.allArray objectAtIndex:index];
// 每次点击, 状态变为与原来相反的值
 group.opened = !group.isOpened;
 [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:index] withRowAnimation:UITableViewRowAnimationNone];
}

我们平时用的QQ下拉列表, 未打开时不显示好友, 打开后才展示好友列表. 所以应该在numberOfRowsInSection方法中要进行设置.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 FriendGroup *group = [self.allArray objectAtIndex:section];
// 如果未打开 count为0 如果打开 count为group的属性数组对应的个数
 NSInteger count = group.isOpened ? group.friends.count : 0;
 return count;
}

效果如下图

总结

以上就是IOS实现简易版的QQ下拉列表的全部内容,效果虽然很简单,但还会希望对大家开发IOS有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ios
, 下拉列表
, qq下拉列表
ios开发下拉列表
ajax实现级联下拉列表、android实现下拉列表、input 实现下拉列表、js实现下拉列表、js 实现检索下拉 列表,以便于您获取更多的相关知识。

时间: 2024-11-03 12:56:40

IOS实现简易版的QQ下拉列表_IOS的相关文章

iOS实现简易抽屉效果、双边抽屉效果_IOS

本文实例为大家分享了iOS实现抽屉效果的全部代码,供大家参考,具体内容如下 iOS实现简易抽屉效果,代码: @interface ViewController () { UIView* _leftView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from

iOS和Android版Instagram新增多账户功能

在使用社交网络中,很多用户在一个社交网络上会同时拥有多个账号,包括微博.QQ等很多国内社交软件都已经推出了多账号管理功能.今天,Instagram也宣布开始支持多账户功能. Instagram最多能关联5个账户.从今天起,用户就可以去下载7.15版本号的iOS和Android版Instagram去使用这个功能.在账户设置界面中,用户可以很方便地在多个账户间进行切换.新版 Instagram 还支持所有关联账户的消息推送. 从去年11月起,Instagram就已经开始对这个功能进行了测试.此前很多

iOS 用故事版拉属性,属性重复

问题描述 iOS 用故事版拉属性,属性重复 用故事版拉属性,把之前的故事版删了替换成成新的故事版, 结果一个属性显示关联两个属性 , 怎么解决啊? 解决方案 product 执行一下clean命令,不行的就重启下mac,这种奇葩问题我还真遇到过,不过一般我都试试这两招,一般奇葩问题都能解决

.NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文件系统.总的来说,它们针对的都是"本地"文件,接下来我们通过自定义FileProvider构建一个"远程"文件系统,我们可以将它视为一个只读的"云盘".由于文件系统的目录结构和文件内容都是通过HTTP请求的方式读取的,所以我们将这个自定义的FileP

Secret开放iOS和Android版的下载

5月22日,匿名社交应用Secret周三宣布,将在全球范围内开放iOS和Android版应用的下载. 于今年1月Secret首先在美国推出了iOS版应用,这次就是Secret第一次推出Android版本.Android版应用将提供独特的双消息流设计:"好友"消息流将基于Secret通常的算法显示信息,而"探索"消息流允许用户探索全球范围内Secret的消息,这一功能和竞争对手Wisper是类似的. 除了扩大服务的覆盖范围,用户以新方式与他人互动Secret也是支持的

ios如何实现android qq上面的左右滑动切换界面呢?

问题描述 ios如何实现android qq上面的左右滑动切换界面呢? 这种效果是使用uisegmentcontrol实现的吗? 解决方案 使用UIScrollView应该就可以实现类似这种效果 解决方案二: 你可以参考一下 UISegmentedControl 的文档,内容很全,希望能帮的上你.

IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)

1.IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)  开始搭建登录界面 登录界面效果图:  相关的图片资源下载百度云备份链接: http://pan.baidu.com/s/1o71cvMU 密码: 2h7e 步骤开始:   设置辅助窗口的位置在下方     快捷键option,然后拖拽复制之后:                                 这里就直接省去了将背景颜色改为经典黑了.   到这里QQ空间的登录界面搭建完毕.   下面进行登录逻辑的实现:  

ios文件传输-iOS文件传输(类似QQ快传)

问题描述 iOS文件传输(类似QQ快传) 类似QQ面对面快传的,不联网,只需要打开Wi-Fi就可以,求大神指点, 解决方案 那个是wifi通信.大家都连同一个wifi下.一端QQ做服务器,一端做客户端.直接交互数据.

安卓版手机qq在线状态如何改成iPhone在线状态?

问题描述 安卓版手机qq在线状态如何改成iPhone在线状态? 安卓手机qq在线时只能显示手机在线,而苹果就是iPhone在线,甚至还有6s什么plus.安卓如何修改成iPhone呢? 解决方案 QQ在线状态 解决方案二: 直接root修改机型啊 解决方案三: 为什么很多人有点儿钱了,都要换个苹果呢,甚至没钱也要想法买,我支持国产, 解决方案四: 不可以的吧. 解决方案五: root修改机型,,,