iOS Programming Camera  2 

1.1 Creating BNRImageStore

The image store will fetch and cache the images as they are needed. It will also be able to flush the cache if the device runs low on memory.

 

Create a new NSObject subclass called BNRImageStore. Open BNRImageStore.h and create its interface:

 

#import <Foundation/Foundation.h> @interface BNRImageStore : NSObject + (instancetype)sharedStore;

- (void)setImage:(UIImage *)image forKey:(NSString *)key; - (UIImage *)imageForKey:(NSString *)key;
- (void)deleteImageForKey:(NSString *)key;

@end

 

In BNRImageStore.m, add a class extension to declare a property to hang onto the images. @interface BNRImageStore ()

@property (nonatomic, strong) NSMutableDictionary *dictionary; @end
@implementation BNRImageStore

 

Like the BNRItemStore, the BNRImageStore needs to be a singleton. In BNRImageStore.m, write the following code to ensure BNRImageStore's singleton status.

@implementation BNRImageStore

+ (instancetype)sharedStore

{
static BNRImageStore *sharedStore = nil;

if (!sharedStore) {

sharedStore = [[self alloc] initPrivate]; }

return sharedStore; }

// No one should call init - (instancetype)init

{
@throw [NSException exceptionWithName:@"Singleton"

return nil; }

reason:@"Use +[BNRImageStore sharedStore]" userInfo:nil];

// Secret designated initializer - (instancetype)initPrivate

{
self = [super init];

if (self) {

_dictionary = [[NSMutableDictionary alloc] init]; }

return self; }

-  (void)setImage:(UIImage *)image forKey:(NSString *)key
{
[self.dictionary setObject:image forKey:key];

-  (UIImage *)imageForKey:(NSString *)key
{
return [self.dictionary objectForKey:key];

-  (void)deleteImageForKey:(NSString *)key
{
if (!key) {
return; }
[self.dictionary removeObjectForKey:key]; } 

 

1.2 Creating and Using Keys

When an image is added to the store, it will be put into a dictionary under a unique key, and the associated BNRItem object will be given that key. When the BNRDetailViewController wants an image from the store, it will ask its item for the key and search the dictionary for the image. Add a property to BNRItem.h to store the key.

@property (nonatomic, copy) NSString *itemKey;

 

The image keys need to be unique in order for your dictionary to work.

为了让你的dictionary 工作,你必须让image key 是独特的。

While there are many ways to hack together a unique string, you are going to use the Cocoa Touch mechanism for creating universally unique identifiers (UUIDs), also known as globally unique identifiers (GUIDs).

有许多方式组成一个独特的string,你可以使用cocoa touch mechanism 来创建universally unique  identifiers(UUIDs),也就是globally unique identifiers (GUIDs). 

Objects of type NSUUID represent a UUID and are generated using the time, a counter, and a hardware identifier, which is usually the MAC address of the WiFi card.

类型为NSUUID 的对象代表了一个UUID 。它由time,counter,a hardware identifier ,which is usually the mac address of the  wifi card .

When represented as a string, UUIDs look something like this:

4A73B5D2-A6F4-4B40-9F82-EA1E34C1DC04

 

#import "BNRImageStore.h"

 

// Create an NSUUID object - and get its string representation NSUUID *uuid = [[NSUUID alloc] init];
NSString *key = [uuid UUIDString];

_itemKey = key;

 

 

// Store the image in the BNRImageStore for this key [[BNRImageStore sharedStore] setImage:image

forKey:self.item.itemKey];

 

Therefore, the key is a persistent way of referring to an image.

一个key 是指向一个image 的持久化方式。

1.3 Wrapping up BNRImageStore

you need to teach BNRDetailViewController how to grab the image for the selected BNRItem and place it in its imageView.

你应该告诉BNRDetailViewController怎样获取image 对于选定的BNRItem,并把它放到它的imageView上。

 

The BNRDetailViewController's view will appear at two times: when the user taps a row in BNRItemsViewController and when the UIImagePickerController is dismissed. In both of these situations, the imageView should be populated with the image of the BNRItem being displayed.

NSString *imageKey = self.item.imageKey;

// Get the image for its image key from the image store

UIImage *imageToDisplay = [[BNRImageStore sharedStore] imageForKey:imageKey];

// Use that image to put on the screen in the imageView

self.imageView.image = imageToDisplay;

 

If there is no image associated with the item, then imageForKey: will return nil. When the image is nil, the UIImageView will not display an image.

如果没有与该项连接的image,那么imageForKey 将会返回nil。当image 是nil时,UIImageView将不展示一个image。

1.4 Dismissing the Keyboard

 

When the keyboard appears on the screen in the item detail view, it obscures BNRDetailViewController's imageView. This is annoying when you are trying to see an image, so you are going to implement the delegate method textFieldShouldReturn: to have the text field resign its first responder status to dismiss the keyboard when the return key is tapped.

所以你将要实现委托 方法textFieldShouldReturn 来让text field resign 它的first responder status 来取消keyboard 当return 建按下时候。 

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{
[textField resignFirstResponder];

return YES; }

 

It would be stylish to also dismiss the keyboard if the user taps anywhere else on BNRDetailViewController's view. You can dismiss the keyboard by sending the view the message endEditing:, which will cause the text field (as a subview of the view) to resign as first responder.

你可以通过给view发 信息endEditing来解除keyboard,这将会导致text field  resign as first responder .

You have seen how classes like UIButton can send an action message to a target when tapped. Buttons inherit this target-action behavior from their superclass, UIControl.

Buttons 继承这个tareget action  行自 UIControl。

You are going to change the view of BNRDetailViewController from an instance of UIView to an instance of UIControl so that it can handle touch events.

 

In BNRDetailViewController.xib, select the main View object. Open the identity inspector and change the view's class to UIControl

- (IBAction)backgroundTapped:(id)sender

{
[self.view endEditing:YES];

}

 

 

iOS Programming Camera 2的更多相关文章

  1. iOS Programming Camera 1

     iOS Programming Camera  1 1 Displaying Images and UIImageView 1.1  put an instance of UIImageView o ...

  2. iOS Programming Autorotation, Popover Controllers, and Modal View Controllers

    iOS Programming Autorotation, Popover Controllers, and Modal View Controllers  自动旋转,Popover 控制器,Moda ...

  3. iOS Programming State Restoration 状态存储

    iOS Programming State Restoration 状态存储 If iOS ever needs more memory and your application is in the ...

  4. Head First iOS Programming

    内部分享: Head First iOS Programming http://www.slideshare.net/tedzhaoxa/head-first-ios-programming-4606 ...

  5. iOS Programming Recipe 6: Creating a custom UIView using a Nib

    iOS Programming Recipe 6: Creating a custom UIView using a Nib JANUARY 7, 2013 BY MIKETT 12 COMMENTS ...

  6. iOS Programming Controlling Animations 动画

    iOS Programming Controlling Animations 动画 The word "animation" is derived from a Latin wor ...

  7. iOS Programming UIStoryboard 故事板

    iOS Programming UIStoryboard In this chapter, you will use a storyboard instead. Storyboards are a f ...

  8. iOS Programming NSUserDefaults

    iOS Programming NSUserDefaults  When you start an app for the first time, it uses its factory settin ...

  9. iOS Programming Localization 本地化

    iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...

随机推荐

  1. HTML5中meta属性

    meta属性在HTML中占据了很重要的位置.如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等.虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能够熟 ...

  2. CRM 插件奇怪的报错

    CRM插件,数据库方式注册.报错 找不到方法:“Void Microsoft.Xrm.Sdk.Entity..ctor(System.String, System.Guid)”. 这个错误让人摸不着头 ...

  3. YTU 2844: 改错题A-看电影

    2844: 改错题A-看电影 时间限制: 1 Sec  内存限制: 128 MB 提交: 69  解决: 47 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. 小平家长为 ...

  4. APP界面常用的五种颜色搭配

    众所周知,每一种颜色带给用户的视觉感受也是不同的.现在人们对手机的依赖程度,就能看到手机中APP的发展前景,那今天就跟大家聊聊如何通过颜色搭配的不同来进行移动端APP界面的布局和排版设计.移动端UI界 ...

  5. JFreeChart生成饼形图(3) (转自 JSP开发技术大全)

    JFreeChart生成饼形图(3) (转自 JSP开发技术大全) 14.3 利用JFreeChart生成饼形图 通过JFreeChart插件,即可以生成普通效果的饼形图,也可以生成3D效果的饼形图: ...

  6. 唯一性校验 impl 和 action

    IMPL方法实现 //  这个方法是通过ID修改数据 如果得到结果大于0 表明结果有重复 如果得到结果小于0 表明结果正确 @Override public boolean checkVersion( ...

  7. 修改 Appdelegate 文件名为添加项目前缀的方法

    本文假设你的项目是 Test, 那么为了给你的 Appdelegate 文件保持按照项目名为前缀 ,就需要对 Appdelegate 文件进行修改前缀名. 技巧分享:将开发中的 Appdelegate ...

  8. jquery ajax post请求实例

    function test(){ $.ajax({ //提交数据的类型 POST GET type:"POST", //提交的网址 url:"testLogin.aspx ...

  9. Mysql数据库介绍、安装和配置文件

    Mysql数据库介绍.安装和配置文件 MySQL数据库介绍 mysql是开源关系型数据库,遵循GPL协议. mysql的特点是性能卓越且服务稳定,开源,无版本限制,成本低,单进程多线程,多用户,基于C ...

  10. 8 个很有用的 jQuery 技巧(转)

    http://www.oschina.net/question/12_145472 一个基于web的标签设计,打印工具,超diao http://www.oschina.net/question/17 ...