1、列表视图TableView
用于在一个一维的列表中显示数据的方法,是滚动条视图的派生来;有动态和静态两种类型,也可以设置为plain和grouped两种风格;通过data source和delegate来设置不同的显示数据和表格属性。
TableView的组成:列表头table header,分段section,列表尾table footer;每一个section由一个section header、一个section footer和若干个table cell组成,每个cell是一个UIView实例。
Cell的类型:包括基本、子标题、细节(左/右)等;
通常配合TableView Controller使用:一个UITableViewController的view成员即是一个TableView;步骤:(1)新建一个类继承自UITableViewController;(2)向storyboard中拖入一个TableViewController,class改为刚刚新建的类;(3)在新建类中实现delegate和data source的方法,控制列表的类型和显示数据。
静态列表:直接在storyboard中进行设计;表格在程序运行过程中不会动态加载,因此不需要实现delegate和data source方法;
在storyboard中可以可视化设置列表视图cell的各种属性,如下图所示:
关键协议:data source和delegate;UIViewController自动将其delegate和data source设定为self,若向ViewController中手动添加一个tableView,则必须手动设置。
(1)delegate:控制列表的属性、显示的方式等;
选中某一行:
- (void)tableView:(UITableView *)sender didSelectRowAtIndexPath:(NSindexPath *)path;响应提示按钮(i)
- (void)tableView:(UITableView *)sender accessoryButtonTappedForRowWithINdexPath:(NSIndexPath *)indexPath;
(2)data source:控制列表中显示什么数据;
指定显示的cell:
- (UITableViewCell *)tableView:(UITableView *)sender cellForRowAtIndexPath:(NSIndexPath *)path { //定义显示的cell UITableViewCell *cell; cell = [self.tableView dequeReusableCellWithIdentifier:@"cell id" forIndexPath:indexPath];//cell id必须与storyboard中设置的一致。 cell.textLable.text = [self getMyTitleFOrRow:indexPath.row inSection:indexPath.section];//这里同时可以设置cell的其他属性。 return cell; }指定分段的数目(默认为1):
- (NSInteger)numberOfSectionsInTableView:(UITableVIew *)sender;指定每个section的cell个数:
- (NSInter)tableView:(UITableView *)sender numberOfRowsInSection:(NSInteger)section;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; //处理segue.destinationController等信息,根据model的信息设置目标视图控制器 }刷新滚轮:首先在UITableViewController中将refreshing从disabled改为enabled,并ctrl+拖入视图控制器中作为IBAction,在生产的函数中按需调用beginRefreshing和endRefreshing方法。
重新载入数据:调用reloadData在model发生变化的时候将其重新载入;调用reloadRowsAtIndexPaths:重新载入部分数据;
- (void)reloadData; - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animationStyle;
单一的应用,采用了两个storyboard,因此可以自适应与两种不同设备;
iPad界面的风格:Split View和Popover;
如何检测当前设备?
(1)采用以下方法:
BOOL iPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);(2)检测是否存在split view或者popover,或者检测当前界面是否存在其他MVC。
UISplitViewController:由一个Master View Controller和一个Detailed View Controller构成;应处于一个storyboard的顶层,其内部可以添加navigation controller或tabbar controller。
获取Master View Controller和一个Detailed View Controller的方法:
UISplitViewController中的每一个视图控制器均存在一个属性指向UISplitViewController对象:
@property (strong) UISplitViewController *splitViewController;UISplitViewController对象中存在一个NSArray保存Master和Detailed视图控制器,分别保存于下标0和1位置;
@property (copy) NSArray *viewControllers; UIViewController *masterVC = self.splitViewController.viewControllers[0]; UIViewController *detailedVC = self.splitViewController.viewControllers[1];
UISplitViewControllerDelegate:尽可能早地设置view controller的代理,如在awakeFromNib中。
该代理的功能:设置在水平和垂直模式下,Master View是否隐藏,以及设置显示Master View的按钮的属性。
Popover:UIPopoverController不是继承自UIViewController,而在其中有一个UIViewController属性:
@property (nonatomic, strong) UIViewController *contentViewController;
在prepareForSegue中,判断segue参数是否满足isKindOf: UIStoryboardPopoverSegue,并在 UIStoryboardPopoverSegue的UIPopoverController属性中获取视图控制器。