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的更多相关文章

  1. iOS programming UITableView and UITableViewController

    iOS programming  UITableView and UITableViewController A UITableView displays a single column of dat ...

  2. iOS UITableView 与 UITableViewController

    很多应用都会在界面中使用某种列表控件:用户可以选中.删除或重新排列列表中的项目.这些控件其实都是UITableView 对象,可以用来显示一组对象,例如,用户地址薄中的一组人名.项目地址. UITab ...

  3. UITableView & UITableViewController

    内容概要: 本文先讲解了UITableView概述,然后主要从应用方面讲解了UITableViewController(包括add.delete.move单元cell的操作,以及UITableView ...

  4. UITableView的编辑操作

    继续上篇UITableView和UITableViewController, 打开BNRItemsViewController.m,在类扩展中添加如下属性: @property (nonatomic, ...

  5. iOS--UICollectionView(滚动视图)入门

     UICollectionView @interface UICollectionView : UIScrollView   UICollectionView 和UICollectionViewCon ...

  6. iOS开发知识点总结

    main文件做了这几件事: 1. 创建当前的应用程序 2. 根据4个参数的最后为应用程序设置代理类(默认情况下是AppDelegate) 3. 将appDelegate 和 应用程序 建立关联(指定代 ...

  7. iOS-UICollectionView

    1--------------------------------------------------------------------------------------------------- ...

  8. iOS开发- UICollectionView详解+实例

    本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView. UICollectionView 和 UICollectionViewC ...

  9. 苹果Xcode帮助文档阅读指南

    文档导读 https://developer.apple.com/legacy/library/navigation/ 前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容.但是很多人 ...

随机推荐

  1. 入手FUJIFILM X100S

    有个朋友买了,用了说很好,于是在秋叶原的yodobashi体验了好几个星期天之后,终于下定决心出手了,购入了黑色限量版,还能用优惠券减免了200美元,最后全套1200美元.黑色限量版还包括了转接环,那 ...

  2. Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset

  3. Statement和PreparedStatement的异同

    1.首先两个都是java向数据库执行sql语句的对象! java代码连接数据库,并且执行sql语句的步骤如下: //1.注册数据库的驱动程序 Class.forName(driverClass); / ...

  4. Javascript数组系列二之迭代方法1

    我们在<Javascript数组系列一之栈与队列 >中介绍了一些数组的用法.比如:数组如何表现的和「栈」一样,用什么方法表现的和「队列」一样等等一些方法,因为 Javascript 中的数 ...

  5. JVM 之类加载

    一.概述 Java不同于C/C++这类传统的编译型语言,也不同于php这一类动态的脚本语言.可以说Java是一种半编译语言,我们所写的类会先被编译成.class文件,这个.class是一串二进制的字节 ...

  6. CentOS 安装开发环境 并安装coTurn

    从官网 https://www.centos.org/download/ 下载镜像文件 从163的镜像站点下载,速度较快 http://mirrors.163.com/centos/7/isos/x8 ...

  7. windows10 专业版的远程服务器管理工具下载

    一.安装远程服务器管理工具: 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=45520 二.关闭远程服务器管理工具: 1 ...

  8. ueditor在线编辑器的简单使用-上传图片

    由于我的项目个人博客网站需要用到在线编辑器,百度的ueditor编辑器就是一个很好的编辑器.开始比较迷茫的使用,各种百度,没有我满意的答案,明明可以很简单的使用. 1.首先进入ueditor官网下载, ...

  9. 智能合约 solidity 开发的环境基本搭建

    以太坊Dapp开发快速入门 以太坊为开源社区,虽然设计东西都很优秀,但是组件十分的杂乱,因此下面首先简单介绍下以太坊的一些常用组件以及各种工具介绍 Geth Geth是由以太坊基金会提供的官方客户端软 ...

  10. RHEL/Centos7 安装图形化桌面

    Linux是一个多任务的多用户的操作系统,好多linux爱好者在安装完linux后经常遇到一个问题——没有图形化桌面.今天小编在安装RHEL7的时候,一步留神没有安装图形化桌面,下面分享一下安装图形化 ...