iPhoneが開発したplistファイルの作成:コードケース(ピクチャブラウザの作成)

8458 ワード

1、怠惰ロードとは、最初に使用または呼び出したときにロードされます.呼び出さないとロードされません.2、リロードするには(1)Supporting Filesの下に.plistファイルを新規作成し、このファイルを編集します.すべてのデータを含むNSArrayタイプのデータを全体として作成し、NSArrayに複数のNSDictionaryタイプのデータを要素として追加し、各要素NSDictionaryに必要なNSStringタイプのキー値ペアを追加します.(2)コントローラの.hファイルにNSArrayタイプの@property変数を追加する.@property(nonatomic,strong)NSArray*picと仮定する.(3)配列オブジェクトpicのgetメソッドを書き換え、怠惰なロードを実現する.pic配列変数のgetメソッドでは、ステップ1>pic.plistファイルのパスを取得する.pic.plistファイルのパスを取得してpath変数に値を割り当てる[NSBundle mainBundle]は、このアプリを携帯電話にインストールする際のルートパスを取得し、アプリのインストールのルートディレクトリの下でpicを検索することを示す.plistファイルのパスの具体的なコードは以下の通りです:-(NSArray*)pic{if(_pic==nil){NSString*path=[[NSBundle mainBundle]pathForResource:@"pic.plist"ofType:nil];//ファイルNSArray*array=[NSArray arrayWithContentsOfFile:path];}   return _pic; } 3、画像プレーヤーの実装手順:(1)新規.plistファイル(pic.plist)を作成し、内容を編集し、配列NSArrayを追加し、各辞書を要素として配列に追加します.(各辞書にはNSStringタイプの2つのキー値ペアがあり、iconキーは画像の名前を表し、titleは画像の下のタイトルを表します)(2)コントローラの.hファイルに配列タイプの属性を追加します.(@property)すなわち@property(nonatomic,strong)NSArray*pic;(3)配列のgetメソッドを書き換え、携帯電話におけるappのルートパスをメソッド内で取得し、ルートパスから配列をNSArray配列に読み出し、配列を返す.すなわち、怠け者ロードを実現する.(4)現在の枚数を表すインデックスをコントローラの.hファイルに追加し、値を付けない前にシステムのデフォルトは0である.(@property)@property(nonatomic,assign)int index;(5)コントローラの.hファイルにUIIImgeViewプロパティ(imgViewIcon)、上にページ数を表示するUIlabelコンポーネントプロパティを追加する(lblIndex)と、画像の下のタイトルを表示するUIlabelコンポーネントプロパティ(lblTitle)を追加し、前のボタンと次のボタンを追加し、viewDIdLoadメソッドでコンポーネントのプロパティを設定し、リスニングメソッドをバインドします.(6)次の画像の傍受方法を実現する.手順は以下の通りである:1>インデックスを1から2まで増加させる>現在の画像のデータを配列から取得する3>取得したデータをインタフェース上のコントロールに設定し、Image属性で画像ボックス内の画像を設定する4>画像が最後の1枚に等しい場合、現在のインデックスがcount-1の場合、「次」のボタンを使用できないように設定します.具体的なコードは以下の通りです:-(void)next{self.index+;//1インデックス++NSDictionary*dict=self.pic[self.index];//辞書から現在の画像のデータself.lblIndex.text=[NSString stringWithFormat:@"%d/%ld",self.index,self.pic.cont]を取得します.;//上のUILabelのページ数を設定//イメージ属性でピクチャボックス内のピクチャselfを設定.imageVIew.Icon.image = [UIImage imageNamed:dict[@“icon”]]; self.lblTitle.text = dict[@“title”];//この画像のタイトル//最後の画像の場合はselfが使用できないようにボタンを設定します.btnNext.enabled = (self.index != (self.pic.count - 1)); } (7)前のボタンを設定する傍受方法は、次のボタンを実装する方法とほぼ同じであり、最後にボタンを無効にする場合にコードを変更することが唯一異なる.if(self.index==0){self.btnPre.enabled=NO;}else{    self.btnPre.enabled = YES; } 最適化後:self.btnPre.enabled=(self.index!=0)注意:(一)このプログラムの最初のBug:プログラムが起動したときにリスニングメソッドがトリガーされず、plistファイルがロードされていないためピクチャは表示されません.解決策は以下の通りです:viewDidLoadメソッドでindex=-1にし、次のピクチャのリスニングメソッドを呼び出せばいいです.すなわち[self next];(二)このプログラムの2番目のBug:最後の画像をクリックして「次」のボタンを無効にした後、「前」をクリックします.を選択します.ソリューション:両方のリスニング・メソッドで、両方のボタンを判断し、無効化と有効化のステータスを設定する必要があります.すなわち、第1の傍受方法で状態を設定したコードを第2の傍受方法に追加し、第2の傍受方法で状態を設定したコードを第1の傍受方法に追加する.できます.(3)上のLabelに表示されているindexは合計枚数より1つ少ない.解決方法:コンテンツを設定するときにindex+1でよい.(四)コードの改善.第1の傍受方法と第2の傍受方法のコンテンツコードはほとんど同じであるため、配列から辞書の内容を読み取り、コンポーネントに設定したこれらの雷同コードを別の方法に抽出し、それぞれ傍受方法で呼び出すことができる.4、plistファイルの使用:(1).plistファイルは、通常、プロジェクト下のSupporting Filesの下に作成されます(2).plistファイルを作成するときに、三角記号が下に点を付けていない場合は、データの上の+または-をクリックすると、このデータに兄弟データを追加したり削除したりすることになります.三角記号が下に点を付けている場合は、削除を増やしたのはこのデータのサブデータになります.(3)一般的にNSArrayタイプのデータを新規作成する(すべてのデータの全体を含む)、三角記号をクリックし、+をクリックしてNSArrayに辞書データを追加すると、1つの辞書データに1つのオブジェクトのすべての情報が含まれます.すなわち、辞書内に複数の属性を表すキー値ペアを作成して1つのオブジェクトの情報を要約します.属性がどのタイプなのか、どのような値タイプを選択します.1つのオブジェクト辞書を作成した後、辞書を選択しますNSArray配列には、このような属性の異なるオブジェクトが複数含まれているため、貼り付けをコピーして貼り付けます.次に、属性値を1つずつ変更します.(4)リロード方式で.plistファイルを読み込む.
1>NSArrayプロパティを設定し、そのgetメソッドを書き換えます.メソッドでは、現在のappが携帯電話にインストールされているルートディレクトリの下にあるplistファイルの具体的なディレクトリを[NSBundle mainBundle]メソッドで取得します.次に、ディレクトリから配列のクラスメソッドarrayWithContentsO分Fileを使用してファイルの内容を新しいNSArrayオブジェクトに読み込み、オブジェクトを返します.
使用するplistファイルのメリットは次のとおりです.
データを直接コードに書くのは合理的な方法ではありません.データが頻繁に変更される場合は、対応するコードを常に開いて修正し、コードの拡張性が低い
このため、常に変化するデータをファイルに格納し、プログラムが起動してファイルから最新のデータを読み出すことが考えられる.データを変更する場合は、直接データファイルを変更すればよいので、コードを変更する必要はありません.
一般にNSArrayやNSDictionaryのようなデータを格納するために属性リストファイルを使用することができ、この属性リストファイルの拡張子はplistであるため、「Plistファイル」にもなる
.plistファイルの作成手順は次のとおりです.
1、plistファイルの作成
2、ファイルに配列を作成してディクショナリ属性オブジェクトを含む
3.NSArray配列に複数の辞書オブジェクトをコピーする
4、各辞書オブジェクトの各属性値を設定する
plistファイル作成完了
 
コード検証の例は次のとおりです.
新しいsimple Viewを持つプロジェクトを作成し、対応するピクチャリソース、2つのボタンの3つの異なる状態のボタン、再生するピクチャリソースをドラッグします.
そして、ファイル情報に基づいて上記の手順に従って新規作成する.plistファイル.次のようにコードを編集します.
コントローラを編集します.hファイルは以下の通りである.
//
//  ViewController.h
//  plist           
//
//  Created by apple on 15/8/30.
//  Copyright (c) 2015  LiuXun. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property (nonatomic, strong) NSArray * pic;
@property (nonatomic, assign ) int index;
@property (nonatomic, strong) UIButton *  btnNext;
@property (nonatomic, strong) UIButton *btnPre;
@property (nonatomic, strong) UIImageView * icon;
@property(nonatomic, strong) UILabel * lblNum;
@property (nonatomic, strong) UILabel * lblTitle;


-(void)next;  //           

-(void)pre;  //           
@end
コントローラを編集する.mファイルは以下の通りです.
//
//  ViewController.m
//  plist           
//
//  Created by apple on 15/8/30.
//  Copyright (c) 2015  LiuXun. All rights reserved.
//

#import "ViewController.h"
#define   WIDTH     [UIScreen mainScreen].bounds.size.width
#define   HEIGHT   [UIScreen mainScreen].bounds.size.height

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //         
    self.lblNum = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, WIDTH, WIDTH/5)];
    [self.view addSubview:self.lblNum];
    
    //           
    self.btnPre = [[UIButton alloc] initWithFrame:CGRectMake(0, WIDTH/5+WIDTH/4, WIDTH/5, WIDTH/5)];
    [self.btnPre setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal]; //             
    [self.btnPre setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted]; //           
    [self.btnPre setBackgroundImage:[UIImage imageNamed:@"left_disable.png"] forState:UIControlStateDisabled];  //           
    //       
    [self.btnPre addTarget:self action:@selector(pre) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.btnPre];
    
    //           
    self.btnNext = [[UIButton alloc] initWithFrame:CGRectMake(0.8*WIDTH, WIDTH/5+WIDTH/4, WIDTH/5, WIDTH/5)];
    [self.btnNext setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal];
    [self.btnNext setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted];
    [self.btnNext setBackgroundImage:[UIImage imageNamed:@"right_disable"] forState:UIControlStateDisabled];
    [self.btnNext addTarget:self action:@selector(next) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.btnNext];
    
    //         ImageView
    self.icon = [[UIImageView alloc] initWithFrame:CGRectMake(WIDTH/5, WIDTH/5, 0.6*WIDTH, 0.6*WIDTH)];
    [self.view addSubview:self.icon];
    
    //       Label  
    self.lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(0, WIDTH, WIDTH, WIDTH/5)];
    [self.view addSubview:self.lblTitle];
    self.index = -1;
    [self next];
}

//      get        
-(NSArray *)pic
{
    if (_pic  == nil) {
        //  app          plist     
        NSString *path = [[NSBundle mainBundle] pathForResource:@"images" ofType:@".plist"];
        
        //  plist               
        NSArray *newArray = [NSArray arrayWithContentsOfFile:path];
        _pic = newArray;   //     
    }
    return _pic;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    
}
-(void)next //           
{
    NSLog(@"   ");
    _index ++;
    [self setData];
}
-(void)pre  //           
{
    NSLog(@"   ");
    _index--;
    [self  setData];
}
-(void)setData
{
    NSDictionary *dict = self.pic[self.index];  //                    
    self.lblNum.text = [NSString stringWithFormat:@"%d/%d",self.index+1,self.pic.count];
    [self.lblNum setTextAlignment:NSTextAlignmentCenter];  //       
    self.lblTitle.text = [NSString stringWithFormat:@"%@",dict[@"desc"]]; //             
    [self.lblTitle setTextAlignment:NSTextAlignmentCenter];
    self.icon.image = [UIImage imageNamed:dict[@"icon"]];
    
    //                         
    self.btnNext.enabled = (self.index != (self.pic.count-1));
    self.btnPre.enabled = (self.index != 0);
}
@end
の実行結果は次のとおりです.