【转】 UITableView 的indexPath

  原文:http://blog.csdn.net/mengtnt/article/details/6733691

前面说过了viewController的一些基本注意事项。这里针对不同的viewController类,描述一下各自用法的注意事项。至于每种viewController的基本用法,可以参看苹果的官方文档”View

controller Programming Guide for IOS”, 上面对 UINavigationController,UITabBarController,UIModelViewController等一些常见的 viewController解释的非常清楚,并且官方还专门针对UITableViewController写了一个向导。

先看 UINavigationController比较常见的问题。在实际开发中,往往会发现设计的导航条和苹果标准的导航条不一样,毕竟 大家都用苹果默认的导航条难免会有视觉疲劳。出现这种情况怎么办?如果仅仅是改变导航条的颜色还好办,如果设计的导航条和苹果默认的导航条大相径庭那就麻 烦了。下面就分析下根据设计的导航条跟苹果默认的导航条相差的不同情况,用不同的方法实现。

1)如果仅仅改变颜色,并且导航栏中的buttomItem的形状也用苹果自带的形状,那么就很简单了,只要更改tintColor就可以了。

2)如果导航条要增加背景图片,但是这个背景图片的宽和高保持和导航条默认的一样。这样可以考虑用下面的代码实现:

[plain] view plaincopy

  1. UIImageView *barSeperator = [[UIImageView alloc] initWithImage:[cache retrieveObjectNamed:@"[email protected]"]];
  2. barSeperator.frame = CGRectMake(0, self.navigationController.navigationBar.bounds.size.height - 2, 320, 2);
  3. UIImageView *barImage = [[UIImageView alloc] initWithImage:[cache retrieveObjectNamed:@"[email protected]"]];
  4. barImage.frame = CGRectMake(0, 0, 320, self.navigationController.navigationBar.bounds.size.height - 2);
  5. [self.navigationController.navigationBar addSubview:barImage];
  6. [self.navigationController.navigationBar addSubview:barSeperator];
  7. [barSeperator release];
  8. [barImage release];

原理很简单就是在导航条上面加一个背景图片,不过这个方法最好写在- (void)viewWillAppear中,而在
viewWillDisappear的时候把这个背景条去掉,这样就不会影响下一个导航条的外观。那么在增加了这个背景条的同时,最好再用自己设计的
UIBarButtonItem,因为现再用系统自带的就显的及其不自然。这样就需要你在自己设计的viewcontroller中
navigationItem的hidden属性设为YES,然后自己向导航条上增加UIButton就行了,也就是完全不用
UIBarButtonItem了,因为这个控件的形状你很难改变。

3)最后就是最离谱的设计,完全背弃苹果导航条的设计规则,导航条的背景,形状和大小都不一样,那么只能用下面的方法了。就是隐藏导航条,然后自己
单独设计一个UIView或者UIImageView放上去,只是用到了UINavigationController对
UIViewController的导航功能而已。

这里需要指出的是UIViewController类中都会有导航条类的navigationItem的属性,但是这里只读的,你不能给它指定
UIBarButtonItem,这个应该只是给开发者提供一个简单接口便于访问。如果要改变还是要进入到UINavigationController
中的items获得。

UITableViewController是开发中最常用的一个类。UITableView中单元格的控制往往是难点,根据单元格内容排
布的不同,如何选用不同的cell。在”Table View Programming Guide for IOS”都有详细的解释,下面只是针对容易
犯错误的地方进行讨论。

1)当你使用系统自带的单元格类型的时候如:UITableViewCellStyleSubtitle首先要清楚这个类型的单元格如何布局的。

图1

所以有些时候使用这些默认的属性,但是又的按照软件设计的图纸开发。譬如:Image可能设计的比官方指定的要宽很多,可能占用了cell的
1/3。你如果用默认属性是怎么都不可能改变图片的宽度的,因为cell中ImageView的属性是readOnly,像这种情况就没有办法必须自定义
单元格了。还有就是AccessoryView,如果你用系统自带的单元格属性,同样大小已经限制了,你无论如何都是改变不了的,所以在开发前,分析时一
定要考虑这些问题,否则开发的时候会非常的棘手。就像上面说的,如果某个设计和UITableViewCellStyleSubtitle中的布局非常相
似,但是就是image宽度不一样,这样如果当初你选择了UITableViewCellStyleSubtitle类型,你就开始纠结吧,无论怎么调节
图片的大小都是很难实现出设计图纸的效果。

2)UITableView单元格往往是需要重用的,所以如果这样写代码:

[plain] view plaincopy

  1. - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  2. static NSString *CellIdentifierText = @"CellText";
  3. UITableViewCell *cell=nil;
  4. cell = [tableView dequeueReusableCellWithIdentifier:@"Message"];
  5. if (cell == nil) {
  6. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Message"]autorelease];
  7. UIImageView * imgview = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]];
  8. imgview.frame = CGRectMake(0,53, 320, 1);
  9. [cell.contentView addSubview:imgview];
  10. [imgview release];
  11. return cell;

这里增加的UIImageView如果不remove的话,会在所有的单元格中显示,所以如果单元格的布局不同时,一定要慎用重用,不然会发现单元格中的布局乱七八糟的。

3)UITableView经常会用到NSIndexPath这个属性,用来确定单元格的位置,那么你要想获得第三行的单元格实体,你代码会这样写么:

[plain] view plaincopy

  1. NSIndexPath * index = [[NSIndexPath alloc] initWithIndex:3];
  2. UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

如果你这样写,可以保证程序crash掉。因为NSIndexPath是属于Foundation.framework中的类,代表的是在一颗树中指向某个节点的路径。如下图所示:

图2

而IOS为NSIndexPath增加了编程的接口,目的是用来适应UITableView对象中,段和行的定位。所以UIKit的API扩展了
NSIndexPath。而indexPathForRow:inSection: 这个方法才是创建得UITableView对象中的
NSIndexPath。所以在用NSIndexPath不能盲目的就给它初始化,一定要根据不同的情况进行分析,如果是要获得
UITableViewCell对象的,一定要用UIKit中扩展的方法。而当你想利用此树存储东西的时候,当然可以使用它初始化的方法。

时间: 2024-10-08 09:34:55

【转】 UITableView 的indexPath的相关文章

iOS开发tips-神奇的UITableView

概述 UITableView是iOS开发中使用频率最高的UI控件,在前面的文章中对于UITableView的具体用法有详细的描述,今天主要看一些UITableView开发中的常见一些坑,这些坑或许不深,但是如果开发中注意不到的话往往比较浪费时间. 神奇的section header 事情的起因是一个网友说要实现一个类似下图界面,但是不管是设置sectionHeaderHeight还是代理方法中实现func tableView(_ tableView: UITableView, heightFor

SWIFT UITableView的基本用法

import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { self.window = UI

swift详解之十九--------------UITableView的基本操作(下拉刷新,新增删除,分组,检索等)

UITableView的基本操作(下拉刷新,新增删除,分组,检索等) 注:本小结总结UITableview的一些基本用法 UITbleView继承自UIScrollView,只能用来显示一列数据(目前就只认识到这里),纵向滑动. 一般有两种方式来实现,直接用UITableViewController , 占满整个屏幕 .不用手动实现UITableViewDataSource 和UITableViewDelegate .另一种方式在UIViewController 中.我们看看这种方式 let t

swift篇第五期:UITableView,OC与Swift互调

先写一个UITableView的简单创建吧,经过前面几期的内容,那么创建一个常用的控件也是蛮简单的哦   class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSURLConnectionDataDelegate {          var dataArray = NSMutableArray()     var tableView: UITableView?     overr

iOS开发——UI篇Swift篇&玩转UItableView(四)自定义&封装

UItableView自定义&封装 一:Model 1 class AppsModel: NSObject { 2 3 //定义模型的三个属性 4 var imageName:String! //图片名称 5 var appName:String! //应用名称 6 var appDescription:String! //应用描述 7 8 9 10 //自定义初始化方法 11 init(imageName image_Name:String , app_Name:String , app_De

Swift - UITableView展开缩放动画

效果 源码 https://github.com/YouXianMing/Swift-Animations // // HeaderViewTapAnimationController.swift // Swift-Animations // // Created by YouXianMing on 16/8/9. // Copyright © 2016年 YouXianMing. All rights reserved. // import UIKit class HeaderViewTapA

iOS开发——实战篇Swift篇&UItableView结合网络请求,多线程,数据解析,MVC实战

UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高级知识:网络请求,JSON数据解析一起应用到一个项目中来. 好了,废话不多说,我们直接开始吧. 首先看看最终的效果: 是不是很简单,就是个UItableView显示一些简单的数据,如果你真的觉得太简单了,那么请绕道,寻找更深入东西,但或者没有你想的那么简单,这不仅仅是一个tableView,为什么呢

iOS开发——UI_swift篇&UITableView实现单元格展开与隐藏

UITableView实现单元格展开与隐藏 下面是一个列表单元格cell的折叠展开效果的demo. 当点击单元格时会展开该单元格,便于显示一些详情什么的.点击其他单元格原来的会关闭,同时有动画效果. 效果如如下:   代码如下: 1 import UIKit 2 3 class ViewController: UIViewController,UITableViewDelegate, 4 UITableViewDataSource { 5 6 var tableView:UITableView?

iOS开发——UI_swift篇&UITableView实现索引功能

UITableView实现索引功能 像iOS中的通讯录,通过点击联系人表格右侧的字母索引,我们可以快速定位到以该字母为首字母的联系人分组. 要实现索引,我们只需要两步操作: (1)实现索引数据源代理方法 (2)响应点击索引触发的代理事件 效果图如下: 代码如下: 1 import UIKit 2 3 class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource{ 4 5 var tableV