UITableView 和 UITableViewController
UITableView:显示有多行数据的一个列。
新建一个过程:Xcode -> File -> New -> Project...,然后选择iOS -> Application -> Single View Application.
Product Name为HomePwner,其他设置如下所示:

当使用UITableView的时候,我们必须考虑还需要什么来让这个table能在你的App上工作。
1)一个UITableView一般需要一个视图控制器来处理其在屏幕上显示的样式;
2)一个UITableView需要一个数据源;
3)一个UITableView一般需要一个委托对象,通知其他对象涉及UITableView的事件。委托可以是任何对象,只要其遵守UITableViewDelegate协议。
UITableViewController类实例满足上述三个角色,即:视图控制器、数据源和委托。当UITableViewController创建了一个UITableView视图时,UITableView的dataSource和delegate实例变量自动设置为指向UITableViewController。其关系如下所示:

创建一个UITableViewController的子类:
File -> New -> File...,iOS -> Source -> Cocoa Touch Class,点击Next,Class为:BNRItemsViewController,其他设置如下:

UITableViewController指定的初始化方法为initWithStyle:,我们现在编写BNRItemsViewController指定初始化方法为init,需要1)调用父类的指定初始化方法;2)重载父类的指定初始化方法。
在BNRItemsViewController.m中添加如下代码:
- (instancetype)init {
self = [super initWithStyle:UITableViewStylePlain];
return self;
}
- (instancetype)initWithStyle:(UITableViewStyle)style {
return [self init];
}
由于不用默认的视图控制器作为根视图控制器,所以修改如下设置:点击工程名Homepwner -> Targets Homepwner -> General -> Deployment Info -> Main Interface 设置为空。
在BNRItemsViewController.m文件的顶部添加如下代码:
#import "BNRItemsViewController.h"
修改application:didFinishLaunchingWithOptions:方法如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
BNRItemsViewController *itemsViewController = [[BNRItemsViewController alloc] init];
self.window.rootViewController = itemsViewController;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
添加BNRItem类,File -> New -> File...,iOS -> Source -> Cocoa Touch Class,点击Next,Class为:BNRItem;Subclass of:NSObject。
BNRItem.h的内容如下所示:
#import <Foundation/Foundation.h> @interface BNRItem : NSObject @property (nonatomic, copy) NSString *itemName;
@property (nonatomic, copy) NSString *serialNumber;
@property (nonatomic) int valueInDollars;
@property (nonatomic, readonly) NSDate *dateCreated; + (instancetype)randomItem; // Designated initializer for BNRItem
- (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber; - (instancetype)initWithItemName:(NSString *)name; @end
BNRItem.m的内容如下所示:
#import "BNRItem.h" @implementation BNRItem + (instancetype)randomItem
{
// Create an immutable array of three adjectives
NSArray *randomAdjectiveList = @[@"Fluffy", @"Rusty", @"Shiny"]; // Create an immutable array of three nouns
NSArray *randomNounList = @[@"Bear", @"Spork", @"Mac"]; // Get the index of a random adjective/noun from the lists
// Note: The % operator, called the modulo operator, gives
// you the remainder. So adjectiveIndex is a random number
// from 0 to 2 inclusive.
NSInteger adjectiveIndex = arc4random() % [randomAdjectiveList count];
NSInteger nounIndex = arc4random() % [randomNounList count]; // Note that NSInteger is not an object, but a type definition
// for "long" NSString *randomName = [NSString stringWithFormat:@"%@ %@",
randomAdjectiveList[adjectiveIndex],
randomNounList[nounIndex]]; int randomValue = arc4random() % ; NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c",
'' + arc4random() % ,
'A' + arc4random() % ,
'' + arc4random() % ,
'A' + arc4random() % ,
'' + arc4random() % ]; BNRItem *newItem = [[self alloc] initWithItemName:randomName
valueInDollars:randomValue
serialNumber:randomSerialNumber]; return newItem;
} - (instancetype)initWithItemName:(NSString *)name
valueInDollars:(int)value
serialNumber:(NSString *)sNumber
{
// Call the superclass's designated initializer
self = [super init]; // Did the superclass's designated initializer succeed?
if (self) {
// Give the instance variables initial values
_itemName = name;
_serialNumber = sNumber;
_valueInDollars = value;
// Set _dateCreated to the current date and time
_dateCreated = [[NSDate alloc] init];
} // Return the address of the newly initialized object
return self;
} - (instancetype)initWithItemName:(NSString *)name
{
return [self initWithItemName:name
valueInDollars:
serialNumber:@""];
} - (instancetype)init
{
return [self initWithItemName:@"Item"];
} - (void)dealloc
{
NSLog(@"Destroyed: %@", self);
} - (NSString *)description
{
NSString *descriptionString =
[[NSString alloc] initWithFormat:@"%@ (%@): Worth $%d, recorded on %@",
self.itemName,
self.serialNumber,
self.valueInDollars,
self.dateCreated];
return descriptionString;
} @end
添加BNRItemStore类,File -> New -> File...,iOS -> Source -> Cocoa Touch Class,点击Next,Class为:BNRItemStore;Subclass of:NSObject。
BNRItemStore将是一个singleton,意味着在app中,这个类的对象就只有一个。
BNRItemStore.h添加如下代码:
#import <Foundation/Foundation.h>
@class BNRItem; @interface BNRItemStore : NSObject @property (nonatomic, readonly) NSArray *allItems; + (instancetype)sharedStore;
- (BNRItem *)createItem; @end
BNRItemStore.m添加如下代码:
#import "BNRItemStore.h"
#import "BNRItem.h" @interface BNRItemStore () @property (nonatomic) NSMutableArray *privateItems; @end @implementation BNRItemStore + (instancetype)sharedStore {
static BNRItemStore *sharedStore = nil;
if (!sharedStore) {
sharedStore = [[self alloc] initPrivate];
}
return sharedStore;
} - (instancetype)init {
@throw [NSException exceptionWithName:@"Singleton"
reason:@"Use+[BNRItemStore sharedStore]" userInfo:nil];
return nil;
} - (instancetype)initPrivate {
self = [super init];
if (self) {
_privateItems = [[NSMutableArray alloc] init];
}
return self;
} - (NSArray *)allItems {
return self.privateItems;
} - (BNRItem *)createItem {
BNRItem *item = [BNRItem randomItem];
[self.privateItems addObject:item];
return item;
} @end
在sharedStore类方法中声明了一个static变量为sharedStore,当该方法执行完毕的时候,该指针指向的变量不会被销毁。
返回BNRItemsViewController.m文件,如下,导入BNRItemStore.h和BNRItem.h:
#import "BNRItem.h"
#import "BNRItemStore.h"
然后,更新指定初始化方法:
- (instancetype)init {
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
// 添加5个随机item
for (int i = ; i < ; ++i) {
[[BNRItemStore sharedStore] createItem];
}
}
return self;
}
BNRItemsViewController遵守UITableViewwDataSource,必须实现tableView:numberOfRowsInSection:和tableView:cellForRowAtIndexPath:。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[BNRItemStore sharedStore] allItems] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"
forIndexPath:indexPath];
NSArray *items = [[BNRItemStore sharedStore] allItems];
BNRItem *item = items[indexPath.row];
cell.textLabel.text = [item description];
return cell;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];
}
运行程序,结果如下所示:

UITableView 和 UITableViewController的更多相关文章
- iOS programming UITableView and UITableViewController
iOS programming UITableView and UITableViewController A UITableView displays a single column of dat ...
- iOS UITableView 与 UITableViewController
很多应用都会在界面中使用某种列表控件:用户可以选中.删除或重新排列列表中的项目.这些控件其实都是UITableView 对象,可以用来显示一组对象,例如,用户地址薄中的一组人名.项目地址. UITab ...
- UITableView & UITableViewController
内容概要: 本文先讲解了UITableView概述,然后主要从应用方面讲解了UITableViewController(包括add.delete.move单元cell的操作,以及UITableView ...
- UITableView的编辑操作
继续上篇UITableView和UITableViewController, 打开BNRItemsViewController.m,在类扩展中添加如下属性: @property (nonatomic, ...
- iOS--UICollectionView(滚动视图)入门
UICollectionView @interface UICollectionView : UIScrollView UICollectionView 和UICollectionViewCon ...
- iOS开发知识点总结
main文件做了这几件事: 1. 创建当前的应用程序 2. 根据4个参数的最后为应用程序设置代理类(默认情况下是AppDelegate) 3. 将appDelegate 和 应用程序 建立关联(指定代 ...
- iOS-UICollectionView
1--------------------------------------------------------------------------------------------------- ...
- iOS开发- UICollectionView详解+实例
本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView. UICollectionView 和 UICollectionViewC ...
- 苹果Xcode帮助文档阅读指南
文档导读 https://developer.apple.com/legacy/library/navigation/ 前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容.但是很多人 ...
随机推荐
- iOS------教你如何APP怎么加急审核
苹果的加急审核如何使用呢? 在iTunesconnect页面,点击右上角的“?”图标,在弹出菜单中选择“联系我们”, 联系我们 然后在Contact Us页面,选择“App Review” —> ...
- Linux swappiness参数设置与内存交换
swappiness参数设置与内存交换 by:授客 QQ:1033553122 简介 swappiness,Linux内核参数,控制换出运行时内存的相对权重.swappiness参数值可设置范围在0到 ...
- 章节四、4-For循环
一.For循环格式 package introduction5; public class ForLoopDemo { public static void main(String[] args) { ...
- VS错误:#error 指令: Please use the /MD switch for _AFXDLL builds
我在做MFC时遇到过这个问题,解决方法如下: 修改设置:工程(Project)-> 属性(Properties)-> 配置属性(Configuration Properties)-> ...
- HashMap和Hashtable的同和不同(详细比较)
一.综述 可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值.虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据h ...
- mssql sqlserver避免sql脚本中出现除零错误的方法分享
摘自:http://www.maomao365.com/?p=6612 摘要:下文介绍sql server中,sql脚本避免出现除零错误的方法分享 在各种业务系统开发中,通常会遇到除零的错误,下文分享 ...
- 利用dockerfile制作基于centos7的lnmp镜像(亲测,详细版)
首先呢,这篇文章,也是小弟参考了许多文章,自己整理出来的,有很多不足之处还有待加强,期待各位评论. > LNMP 是代表 Linux 系统下的 Nginx.Mariadb.PHP 相结合而构建成 ...
- 三、Tableau筛选器的使用
一.使用筛选器制作联动效果 注意,下面两幅图以‘是否盈利’来添加颜色标签 图一:地图 图二:月度销售客户细分 图三:月度销售产品类别 1.新增仪表盘:将图一.图二.图三拉进同一个仪表盘 2.在图一原图 ...
- LeetCode算法题-Reverse Linked List(Java实现)
这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...
- Java中使用elasticsearch搜索引擎实现简单查询、修改等操作-已在项目中实际应用
以下的操作环境为:jdk:1.8:elasticsearch:5.2.0 maven架包下载坐标为: <dependency> <groupId>org.elasticsear ...