06-UIKit(tableView数据模型)

目录:

一、UIPageControl

二、table view数据模型

三、反向传值给TableView并更新

回到顶部

一、UIPageControl在页面下显示点

1 重要属性

.numberOfPages有多少个点

.userInteractionEnabled用户控制交互开关

.currentPage当前页

    //创建图片下方的点 PageControl

    UIPageControl *pageControl = [[UIPageControl alloc] init];

    pageControl.frame = CGRectMake(0, self.view.frame.size.height - 50, self.view.frame.size.width, 20);

    //有多少个点 

    pageControl.numberOfPages = self.imageNames.count;

    //控制用户交互开关 点小点是否起作用

    pageControl.userInteractionEnabled = NO;

    self.pageControl = pageControl;

    [self.view addSubview:pageControl];

这里有一个滑动页面之后调用的一个方法,这个方法是scrollview代理中的一个很重要的方法

//滑动之后调用的方法

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

    CGPoint point = scrollView.contentOffset;

    //NSLog(@"%lf,%lf",point.x,point.y);

    //改变pageControl的当前也属性currentPage

    self.pageControl.currentPage = round(point.x / 320);

}

回到顶部

二、table view数据模型

1 数据模型1 tableview -> nsarray -> 对象 -> 属性

TRMyTableViewController : UITableViewController

2 推出新的界面,基本上需要用navigation做

tableview的数据模型1是这样的:首先定义一个公开或者是似有的NSArray数组,定义一个继承自NSObject类,这个类有属性,在tableview中把这个类的引用添加到数组中,然后访问对象里的属性。

三问一响应中的一响应是这样的:就是点击tableview里的cell(中文单人小室)之后做出的响应,这个响应肯定推出一个界面,这个界面是UIViewController通常用self.navagationcontroller导航视图push这个视图,从而成为导航视图中的一个视图,在tableview的代理中系统给我们提供了一个方法来推出这个界面,这个方法是:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

在这个方法里面创建了一个uiviewcontroller视图并被navigationcontroller导航视图push出来。此时一般需要正向传值。

    TRPhoto *photo = self.photos[indexPath.row];

    detailViewController.bigPictureFilename = photo.bigPicuterFileName;

3 模型2:tableview -> NSArray -> 对象 -> NSArray

+(NSArray *)areas{

    TRArea *a1 = [[TRArea alloc] init];

    a1.name = @"北京";

    a1.subNames = @[@"东城", @"西城", @"崇文", @"宣武", @"朝阳", @"海淀"];

    TRArea *a2 = [[TRArea alloc] init];

    a2.name = @"上海";

    a2.subNames = @[@"浦东", @"洋浦", @"松江", @"虹口", @"徐汇", @"闸北"];

    TRArea *a3 = [[TRArea alloc] init];

    a3.name = @"广州";

    a3.subNames = @[@"天河", @"棠下", @"越秀", @"白云"];

    return @[a1,a2,a3];

}

程序流程:

1.创建TRAreaTableViewController

2.注入Model数据

3.navi显示TRAreaTableViewController,三问?几个分区,几行,每一行cell

4.一响应,实现didSelectRowAtIndexPath方法

在方法中推新的tableViewController,在推新的tableViewController之前需要正向传值,

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    TRSubAreaTableViewController *detailViewController = [[TRSubAreaTableViewController alloc] initWithNibName:@"TRSubAreaTableViewController" bundle:nil];

    // 传值

    TRArea *area = self.areas[indexPath.row];

    detailViewController.subAreas = area.subNames;

    detailViewController.title = area.name;

    // Push the view controller.

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

}

加深理解

模型2:NSArray 1-> 对象 -> NSArray2

NSArray 1中有多少个对象就有多少个section。

每个section有多少行,以section做为下标拿到对象,对象中的NSArray2中有多少数据,就有多少行。

每一行是cell,先通过indexPath.section确定是哪个对象,在通过indexPath.row确定此对象中的NSArray2是哪个。

return self.areas.count;//返回区数

 

TRArea *area = self.areas[section];

return area.subNames.count;//返回行数

 

TRArea *area =self.areas[indexPath.section];//区

cell.textLabel.text = area.subNames[indexPath.row];//行

加一问:每个section的header叫什么名字,tableview遵守的协议UITableViewDataSource中提供了一个方法解决这个问题

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    TRArea *area = self.areas[section];

    return area.name;

}

回到顶部

三、反向传值给TableView并更新

          1 输入界面TRInputViewController(委托方)

                 三步曲:

                      1)定义委托协议

                      2)定义委托属性delegate

                      3)用户输入完成后调用委托对象的方法,传参

           2 显示界面TRMemoireViewController(被委托方) TableView

                 三步曲:

                      1) 遵守委托协议

                      2) 实现委托方法

                      3) 设置当前对象为委托方的delegate

                     

                 在委托方法中:

                      1)更新Model数据

                      2)更新界面

                            两种方式:

                      //更新界面 两种方法

    // 1 全部更新 不推荐使用

    //[self.tableView reloadData];//重新加载 全部加载 代价大

    // 2 逐行添加 只更新指定行

    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.memoires.count-1 inSection:0];

    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

作业:

      1. 写一个模仿通讯录的程序

           1)数据模型:

                 TRContact:

                      -firstName:  姓

                      -lastName: 名

                      -phoneNumber: 电话号码

                      -iphone: 电话号码

           2)显示界面

                 Navigation包TableViewController

                      TableViewController

                            -contacts : NSMutableArray

                                       -[item]  TRContact

           3)添加联系人界面

                 自己设计,要求不能用navi  push此界面,要用present来展示此界面,但此界面也有自己的NavigationController

                

                 会涉及反向传值, 使用委托

 

      2. 春节前淘宝广告:

           做一个TableViewController的界面,界面的最上面一行是广告栏,再下面才是商品列表

           广告是一个Cell, Cell中有一个UIScrollView, UIScrollView中有多个UIImageView, 多个imageView可以滚动

           控制frame的问题

 

补充知识点:

[NSMutableArray copy];NSMutableArray调用copy方法返回NSArray

06-UIKit(tableView数据模型)

上一篇:git入门


下一篇:手势