您的位置:首页 > 移动开发 > IOS开发

学习笔记-斯坦福iOS7-第十一课:表格视图和iPad

2016-07-18 16:14 381 查看
一. UITableVIew

1. storyboard 中拖入一个TableViewController,可对Cell进行style定义,或custom;

记住一定设置Cell 的 identifier,代码里提供UITableViewCell数据源时用到的唯一值。

2. protocols :dataSource and delegate;

a. dataSource

主要包括3个:table里多少sections;section里多少rows;提供一个UITableViewCell用来显示row;

注:动态table才需要数据源,静态table已经创建好,直接修改值即可。

b. delegate

主要包括:

.行被选中 : - (void)tableView:(UITableVIew*)sender didSelectRowAtIndexPath:(NSIndexPath*)path;

.行右边的叹号被点击:- (void)tableView:(UITableVIew*)sender 

             accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath;

3. UITableVIew Segue

通过设计器对cell 连接其他VC,如何知道是哪个cell被点击的,通过下面代码:

- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {

   NSIndexPath* indexPath = [self.tableView indexPathForCell:sender];

   ...

}

4. UITableView Spinner

a. UITableViewController 有“activity indicator”控件:UIRefreshControl

- (void)beginRefreshing;

- (void)endRefreshing;

b. 默认没有该功能,开启改功能,可在设计器中,TableViewController - Refreshing - Enabled

5. 数据发生变化后

a. -(void)reloadData; // 刷新可见的行

b. -(void)reloadRowsAtIndexPaths:(NSArray*)indexPaths
withRowAnimation:(UITableViewRowAnimation)animationStyle;
// 刷新部分行

二. Universal Applications (通用应用)

1. 不同Xcode版本默认创建Universal时,创建storyboard的个数有些不同,具体可参加:
http://blog.csdn.net/sharpyl/article/details/51800130
2. 判断是否iPad

BOOL iPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceidiomPad);

3. iPad上同时可以显示多个MVCS,所以检测MVC 是否在屏幕上显示:

if (self.view.window == nil) // 没有在屏幕上显示

4. UISplitViewController

a. 在storyboard设计时,必须是顶层MVC,不能放到tabbarController or navigationController!

b. 访问Master and Detail

. 所有UIViewController 都有个属性: @property (strong)UISplitViewController *splitViewController;

  如果splitViewController 为nil,说明VC 没在splitViewController 上;

. UISplitViewController 有属性:@property (copy) NSArray* viewControllers; //0:master, 1:Detail;

5. UISplitViewControllerDelegate

a. 设置delegate必须非常早,在 awakeFromNib 中,被调用时在viewDidLoad之前;

   并且delegate被调用时,outlets 没有被设置好呢。

b. 给出master是否显示:

- (BOOL)splitViewController:(UISplitViewController*)sender

   shouldHideViewController:(UIViewController*)master

              inOrientation:(UIInterfaceOrientation)orientation {
return NO;  /// 从来不隐藏
return UIInterfaceOrientationIsPortrait(orientation); /// 竖屏隐藏master;

}

c. 当master 隐藏时,需要实现下面委托,来显示一个按钮,点击该按钮,master会显示出来,如果没有实现该委托,按钮不会显示:

- (void)splitViewController:(UISplitViewController*)sender

     willHideViewController:(UIViewController*)master
     withBarButtonItem:(UIBarButtonItem*)barButtonItem
  forPopoverController:(UIPopoverController*)popover {
barButtonItem.title = master.title;
self.navigationItem.leftBarButton = barButtonItem;  /// 

}

d. 当master显示时,实现下面委托,隐藏按钮

- (void)splitViewController:(UISplitViewController*)sender

     willShowViewController:(UIViewController*)master

  invalidatingBarButtonItem:(UIBarButtonItem*)barButtonItem {

    self.navigationItem.leftBarButton = nil; 

}

6. master 变化时,更新detail

a. target/action , master 响应action 后,再调用detail 接口,更新detail;

b. replace segue ,这种方法比较麻烦,很少用。

7. UIPopoverController

a. 本身不是UIViewController,是NSObject,他的作用是控制另一个UIViewController 弹出;按control拖动contentViewController到storyboard;

b. 创建popover segue

- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {

    if([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) {
UIPopoverController *popoverController = ((UIStoryboardPopoverSegue*)segue).popoverController;
...
}

}

c. popover 消失

. code:- (void)dismissPopoverAnimated:(BOOL)animated;

. delegate: 消失时,会被调用:- (void)popoverControllerDidDismissPopover:(UIPopoverController*)sender;

三. demo - 摄影爱好者

包括:UITableView, Flickr, Universal Application, UISplitViewController, UIRefreshControl, GCD。

这个demo 比较全面!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: