【转】 UITableView 的indexPath
原文:http://blog.csdn.net/mengtnt/article/details/6733691
前面说过了viewController的一些基本注意事项。这里针对不同的viewController类,描述一下各自用法的注意事项。至于每种viewController的基本用法,可以参看苹果的官方文档”ViewController Programming Guide for IOS”, 上面对 UINavigationController,UITabBarController,UIModelViewController等一些常见的 viewController解释的非常清楚,并且官方还专门针对UITableViewController写了一个向导。
先看 UINavigationController比较常见的问题。在实际开发中,往往会发现设计的导航条和苹果标准的导航条不一样,毕竟 大家都用苹果默认的导航条难免会有视觉疲劳。出现这种情况怎么办?如果仅仅是改变导航条的颜色还好办,如果设计的导航条和苹果默认的导航条大相径庭那就麻 烦了。下面就分析下根据设计的导航条跟苹果默认的导航条相差的不同情况,用不同的方法实现。
1)如果仅仅改变颜色,并且导航栏中的buttomItem的形状也用苹果自带的形状,那么就很简单了,只要更改tintColor就可以了。
2)如果导航条要增加背景图片,但是这个背景图片的宽和高保持和导航条默认的一样。这样可以考虑用下面的代码实现:
- UIImageView *barSeperator = [[UIImageView alloc] initWithImage:[cache retrieveObjectNamed:@"list_seperator@2x.png"]];
- barSeperator.frame = CGRectMake(0, self.navigationController.navigationBar.bounds.size.height - 2, 320, 2);
- UIImageView *barImage = [[UIImageView alloc] initWithImage:[cache retrieveObjectNamed:@"list_po@2x.png"]];
- barImage.frame = CGRectMake(0, 0, 320, self.navigationController.navigationBar.bounds.size.height - 2);
- [self.navigationController.navigationBar addSubview:barImage];
- [self.navigationController.navigationBar addSubview:barSeperator];
- [barSeperator release];
- [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单元格往往是需要重用的,所以如果这样写代码:
- - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
- static NSString *CellIdentifierText = @"CellText";
- UITableViewCell *cell=nil;
- cell = [tableView dequeueReusableCellWithIdentifier:@"Message"];
- if (cell == nil) {
- cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Message"]autorelease];
- UIImageView * imgview = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Message_separator@2x.png"]];
- imgview.frame = CGRectMake(0,53, 320, 1);
- [cell.contentView addSubview:imgview];
- [imgview release];
- return cell;
- }
这里增加的UIImageView如果不remove的话,会在所有的单元格中显示,所以如果单元格的布局不同时,一定要慎用重用,不然会发现单元格中的布局乱七八糟的。
3)UITableView经常会用到NSIndexPath这个属性,用来确定单元格的位置,那么你要想获得第三行的单元格实体,你代码会这样写么:
- NSIndexPath * index = [[NSIndexPath alloc] initWithIndex:3];
- UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
如果你这样写,可以保证程序crash掉。因为NSIndexPath是属于Foundation.framework中的类,代表的是在一颗树中指向某个节点的路径。如下图所示:
图2
而IOS为NSIndexPath增加了编程的接口,目的是用来适应UITableView对象中,段和行的定位。所以UIKit的API扩展了
NSIndexPath。而indexPathForRow:inSection: 这个方法才是创建得UITableView对象中的
NSIndexPath。所以在用NSIndexPath不能盲目的就给它初始化,一定要根据不同的情况进行分析,如果是要获得
UITableViewCell对象的,一定要用UIKit中扩展的方法。而当你想利用此树存储东西的时候,当然可以使用它初始化的方法。
【转】 UITableView 的indexPath的更多相关文章
- swfit-学习笔记(表UITableView的简单使用)
/*使用与Object-C基本类似,只做简单地使用,创建表及其设置数据源和代理*/ import UIKit class ViewController: UIViewController,UITabl ...
- Swift - UITableView里的cell底部分割线左侧靠边
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, ...
- SWIFT UITableView的基本用法
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: ...
- swift系统学习控件篇:UITableView+UICollectionView
工作之余,学习下swift大法.把自己的学习过程分享一下.当中的布局很乱,就表在意这些细节了.直接上代码: UITableView: // // ViewController.swift // UIt ...
- UITableView swift
// // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...
- iOS开发——实战篇Swift篇&UItableView结合网络请求,多线程,数据解析,MVC实战
UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高 ...
- iOS开发——UI篇Swift篇&玩转UItableView(四)自定义&封装
UItableView自定义&封装 一:Model class AppsModel: NSObject { //定义模型的三个属性 var imageName:String! //图片名称 v ...
- iOS开发——UI篇Swift篇&玩转UItableView(三)分组功能
UItableView分组功能 class UITableViewControllerGroup: UIViewController, UITableViewDataSource, UITableVi ...
- iOS开发——UI篇Swift篇&玩转UItableView(二)高级功能
UItableView高级功能 class UITableViewControllerAF: UIViewController, UITableViewDataSource, UITableViewD ...
随机推荐
- [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】
---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选 ...
- 巧用powerpoint制作符合期刊要求的复合图
- siem主流厂商
http://www.scmagazine.com/siem/products/6428/5/ http://www.edu.cn/wlaq_6572/20131217/t20131217_10532 ...
- Yii widget使用
关于widgets,他们在yii中的关系如下 system.web.widgets 系统自带最基本的widget zii.widgets 是基本扩展 zii.widgets.grid 是基本扩展的重要 ...
- [LeetCode#154]Find Minimum in Rotated Sorted Array II
The question: Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are ...
- 如何解决设置Session保存在StateServer后引起WebService/WebMethod无法异步获取Session
项目中有一个文件上传功能,需要显示文件上传进度.于是使用PageMethods 调用WebService/WebMethod . 在demo中测试一切正常.但是转移到项目中之后无法异步刷新文件上传进度 ...
- POJ-3580-SuperMemo(splay的各种操作)
题意:对数组进行各种操作 其中 REVOLVE右移操作.将区间[a,b]右移c位 首先c可能比较多,可以先对区间长度取模. 在右移之后,可以发现[a,b]被分为两个区间[a,b-c] [b-c+1, ...
- (转载)mysql中百万级数据插入速度测试
(转载)http://www.111cn.net/database/mysql/42453.htm 100W的数据对于很多朋友来说算小菜了,但今天我就想到创建一个大量数据的测试环境,于是找了一下怎么插 ...
- FFT(快速傅里叶变换):UVAoj 12298 - Super Poker II
题目:就是现在有一堆扑克里面的牌有无数张, 每种合数的牌有4中不同花色各一张(0, 1都不是合数), 没有质数或者大小是0或者1的牌现在这堆牌中缺失了其中的 c 张牌, 告诉你a, b, c接下来c张 ...
- foxmail邮箱在代理环境下不能使用解决方法。
由于工作原因,在域环境中但是还不是域用户,怎么设置代理也不能使用邮件客户端,幸亏老大给一软件,如下图 安装超级简单,而且软件很小,安装完后重启,基本不用设置就可以使用,前提是你的邮箱客户端要设置代理服 ...