IOS 学习笔记(UITableView&Something else)PART 4
有个好消息是前文说到的公积金已经审核并发放了。可喜可贺~~
没有坏消息,让您失望了。
继续继续:
为空白项目添加UITableView首页
Treehouse的课程进展比较缓慢,目前看到如何创建一个用于查看博客的应用,BlogReader,基于UITableView,老师很负责地详细说明了如何从一个空白项目入手创建一个UITableView,首先,创建一个空白项目,
[caption id=”” align=”aligncenter” width=”743”] 创建一个新的空白项目[/caption]
所谓空项目,那就是什么都木有:
[caption id=”” align=”aligncenter” width=”255”] 什么都没有,只有基本的AppDelegate[/caption]
首先添加一个StoryBoard作为起点,右键点击新建文件,类型选择User Interface里面的StoryBoard
[caption id=”” align=”aligncenter” width=”589”] 创建新的Storyboard[/caption]
有了StoryBoard之后,不要忘记在项目配置页面上将Main Interface指定为这个StoryBoard,否则运行起来项目,看到的仍将是一片白。
下面,拽一个TableView Controller上去吧~
然后,要为这个View准备一个对应的TableViewController,用于处理代码逻辑。
还是右键创建一个新文件,选择继承类型为UITableViewController,打开对应的.m文件,就看到了已经实现的一些方法。在这里,可以通过定义一个数组来显示对应的数据,不多说,直接上码:
#import <UIKit/UIKit.h> @interface TestViewController : UITableViewController @property(nonatomic,strong)NSArray *blogPosts; @end
#import "TestViewController.h" @interface TestViewController () @end @implementation TestViewController - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.blogPosts = [NSArray arrayWithObjects:@"Blog1",@"Blog2",@"Blog3", nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return self.blogPosts.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; cell.textLabel.text = self.blogPosts[indexPath.row]; // Configure the cell... return cell; } /* // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } */ /* // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ /* #pragma mark - Navigation // In a story board-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end
只做到这里,是不行的,还有两个地方要修改,第一是将AppDelegate.m中的这个函数做一下修改,它自作主张地为你添加了一个空白的Window
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // // Override point for customization after application launch. // self.window.backgroundColor = [UIColor whiteColor]; // [self.window makeKeyAndVisible]; return YES; }
然后,你再运行项目时,会发现有一个异常:
'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
由于列表的实现,是利用多个Cell项目翻滚实现的,否则如果有1000个子项目的长列表,你的App会死得很卡,因此Cell是会被反复使用的,所以要在StoryBoard面板中设置好它,如下图
至于为什么填上”Cell”,回头看看TableViewController.m中的代码就明白了。
至此,它终于显示正常了。
异常断点
当程序崩溃的时候我很想知道是哪里出了问题,XCode再次显示出了它牛逼的一面,通过如下方式,可以为程序添加一个异常断点:
对象类型判断
NSString *a =@"a"; [a isKindOfClass:[NSString class]];