【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新

案例效果:

(1)先在storyboard中拖拽出一个tableView。然后下面用代码。

——tableView继承自scrollView。所以自然有滚动的特性

——最基本的还是数据转模型,以及对cell的赋值

——而cell的赋值那一块,为了优化性能,我们先从tableView的缓存中查找有无被缓存的cell,假设有,直接取出,假设没有再创建。这样提高性能。

——这个缓存池是tableView自带的,当滚动的时候,cell不在视线范围内时,这个cell就被放到缓存池里了。

#import "ViewController.h"
#import "WSHeros.h"

@interface ViewController ()<UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong,nonatomic) NSArray *herosArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    //定义数据源是谁
    self.tableView.dataSource=self;
    //每行高度
    self.tableView.rowHeight=60;
    //行间切割线颜色和样式
    self.tableView.separatorColor=[UIColor colorWithRed:0 green:0 blue:1 alpha:1];
    self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
//隐藏状态栏
-(BOOL)prefersStatusBarHidden{
    return YES;
}
//设置多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.herosArray.count;//数组有多少就多少行
}
//设置每行的cell内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *[email protected]"hero";
    //1、先推断tableView中有无我们须要的缓存的cell。用ID类识别
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
    //2、假设没有,就直接创建。记得给ID识别号
    if (cell==nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    //无论是直接取。还是直接创建。截止此处,有一个cell了。
    //先利用indexPath.row取得行号相应的模型
    WSHeros *hero=self.herosArray[indexPath.row];
    //然后给cell赋值
    cell.textLabel.text=hero.name;
    cell.imageView.image=[UIImage imageNamed:hero.icon];
    cell.detailTextLabel.text=hero.intro;
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    //cell还有背景以及选中背景等选项
    cell.backgroundColor=[UIColor grayColor];
    UIView *bgView=[[UIView alloc]init];
    bgView.backgroundColor=[UIColor redColor];
    cell.selectedBackgroundView=bgView;
    return cell;
}
//字典转模型
-(NSArray *)herosArray{
    if (_herosArray==nil) {
        NSString *path=[[NSBundle mainBundle]pathForResource:@"heros.plist" ofType:nil];
        NSArray *arr=[NSArray arrayWithContentsOfFile:path];
        NSMutableArray * herosMuArr=[[NSMutableArray alloc]init];
        for (NSDictionary * dict in arr) {
            WSHeros *heros=[[WSHeros alloc]initWithDict:dict];
            [herosMuArr addObject:heros];
        }
        _herosArray=herosMuArr;
    }
    return _herosArray;
}

@end

(2)添加点击弹出alert的效果,而且能够改动名字

——由于用到监听tableView点击,所以须要引入协议

——由于用到监听用户点击了Alert里的哪个button,所以须要协议

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>

而且须要设置代理(Alert的代理,在创建的时候直接指定为self就可以)

- (void)viewDidLoad {
   ……
    self.tableView.delegate=self;
   ……
}

——监听tableView被点击时,须要弹出一个带有textField的框。能够用alert.alertViewStyle属性设置,而且把这个模型里面的名字赋值给文本框显示出来。

——此外,还须要把是第几个模型,这个数字记录下来。在下一个方法监听点击alert哪个button的哪个里面须要用到,正好记录到alert的tag中。

——监听是否点击的时“确定”button。假设是,则先获取文本框文字,然后利用alert.tag找到相应的数据模型。用这个获得的文字替换原来的模型数据,最后刷新一下tableView,仅仅有改动数据模型。才干彻底改变tableView的显示结果,否则仅仅改动tableView,等又一次载入的时候还是会显示原来的数据。由于数据模型没有改动。

——思想是:用数据模型控制视图,即改动了数据模型,视图的呈现自然跟着改动。

——这里用到的知识点相对较多,涉及到tableView的reloadData方法。

——涉及到alertView得样式设置方法。

——还涉及到使用tableView和alertView的代理来实现监听。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    WSHeros *hero=self.herosArray[indexPath.row];
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"提示" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"好的", nil];
    alert.alertViewStyle=UIAlertViewStylePlainTextInput;
    [alert textFieldAtIndex:0].text=hero.name;
    alert.tag=indexPath.row;
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex==0) return;
    WSHeros *hero=self.herosArray[alertView.tag];
    hero.name=[alertView textFieldAtIndex:0].text;
    //这里须要传递一个indexPath数组,由于可能刷新不止一行,所以须要知道是几组几行,然后把非常多个组成数组传递进去
    NSIndexPath *path=[NSIndexPath indexPathForRow:alertView.tag inSection:0];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationBottom];
    //下面是刷新所有数据
//    [self.tableView reloadData];
}

终于效果:

时间: 2024-10-20 02:41:03

【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新的相关文章

【iOS开发-56】案例BUG:按钮的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet

接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.按钮多功能用法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击option按钮,答案没满就能点. 在optionClick方法的if(full)中设置,即判断答案是否满了,如果满了,则: if (full) { //如果答案满了,不管是否正确,只要满了,下面的option按钮就不能被点击 for (UIButton *optionBtn in self.optionView.subview

【iOS开发-56】案例BUG:button的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet

接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.button多功能使用方法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击optionbutton,答案没满就能点. 在optionClick方法的if(full)中设置,即推断答案是否满了,假设满了.则: if (full) { //假设答案满了,无论是否正确,仅仅要满了,以下的optionbutton就不能被点击 for (UIButton *optionBtn in self.opt

【iOS开发-57】案例改进:block动画、控件的removeFromSuperview、利用layer设置圆角矩形以及代理模式运用

接上述案例,案例改进:[iOS开发-50]利用创建新的类实现代码封装,从而不知不觉实践一个简单的MVC实验,附带个动画 在上述案例中,我们最后实现了一个动画,点击"下载"按钮变成"已下载"不可点击,然后中间出现提示框. (1)其中有一个小BUG,就是这个提示的透明度变成0之后,这个提示框并没有显示还留在内存中.需要: [tipsLabel removeFromSuperview]; (2)其次,我们可以用另一个代码实现动画,就是用block,这一次是2个block嵌

【iOS开发-54】案例学习:通过UIScrollView的缩放图片功能练习代理模式的详细实现

案例:(在模拟器中按住option键,点击鼠标就会出现缩放的手势) (1)在ViewController.m中: --缩放东西是UIScrollView除了滚动之外的还有一个功能,所以须要缩放的东西应该先放在UIScrollView里.比方此处的imageView: --而我们在缩放时候,scrollView自己是不知道我们要缩放哪个控件的,所以scrollView须要一个代理来告诉它.这个代理一般就是我们的控制器: --而控制器要成为它的代理就必须遵守它的协议. --控制器在接受协议后,就能够

【iOS开发-51】案例学习:动画新写法、删除子视图、视图顺序、延迟方法、button多功能使用方法及icon图标和启动页设置

案例效果: (1)导入所需的素材,然后用storyboard把上半截位置和大小相对固定的东西布局起来.当然,这些控件也要定义成对应地IBOutlet和IBAction方便兴许使用它们. 注意:本案例在3.5inch设备上显示最佳,所以须要设置一下. (2)首先实现点击"下一题"的功能 - (IBAction)nextQuestion { //1.序号添加 self.index++; //2.依据序号拿到相应的模型(对象) NSQuestion *question=self.questi

iOS开发——网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据

网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一片文章已经介绍我们可以使用两个方式来抓取网络数据实现网络爬虫,并且大致介绍了一下怎么使用正则表达式去实现数据的抓取 由于笔者曾经学过一段时间java和android相关的技术,今天就讲讲怎么使用java去抓取网络数据,关于Python有机会等笔者好好研究一下再来分享,但其实会一种就可以,除非你的需求

iOS开发——网络使用技术OC篇&amp;网络爬虫-使用正则表达式抓取网络数据

网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看看网络爬虫的基本原理: 一个通用的网络爬虫的框架如图所示: 网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中.

【iOS开发-53】案例学习:scrollView的核心用法以及无法滚动的解决办法

案例效果: (1)主要的就是练习scrollView的用法.界面里面的其他元素基本都是UIView和UIButton堆砌起来的. (2)主要用代码实现,当然,可以先用storyboard拖个scrollView出来.注意需要滚动的都需要放在scrollView,注意层级关系. (3)我们要在代码中使用设置这个scrollView所以直接拖拽形成一个变量,代码都在ViewController.m中: --设置scrollView的最重要的三个属性如下,已用注释标出. --取得一个控件的最大最小X和

IOS开发学习笔记028-UITableView单组数据显示代码优化

1.性能优化(添加几百个cell到view) 2.如何实现选中某行,改变这个cell最右侧显示的对号按钮 1.如果表格中又几百条数据的话,系统会自动加载显示在界面上得数据,逐一加载 添加100个数据到UITableView中 1 for (int i = 0 ; i < 100 ; i ++) 2 { 3 NSString *icon = [NSString stringWithFormat:@"00%d.png",arc4random_uniform(8) + 1]; 4 NS