スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

UITableViewのセルに > を表示させる。

特に何も考えずに、TableViewがあるコントローラーで下記メソッドを追加する。

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{

// return UITableViewCellAccessoryDetailDisclosureButton;
return UITableViewCellAccessoryDisclosureIndicator;
}

return のコメントアウトをはずせば、矢印がボタンっぽいのに変更されます。
ただ、上記だと以下のようなWariningが発生した。

WARNING: Using legacy cell layout due to delegate implementation of tableView:accessoryTypeForRowWithIndexPath: in . Please remove your implementation of this method and set the cell properties accessoryType and/or editingAccessoryType to move to the new cell layout behavior. This method will no longer be called in a future release.


調査したところ、OS3以降は次のようにしないといけないらしい。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
if (cell == nil) {


cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:kCellIdentifier] autorelease];

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
NSManagedObject* managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [managedObject valueForKey:@"title"];
return cell;
}


※accessoryTypeForRowWithIndexPathメソッドを丸ごと追加するんじゃなくて
cellForRowAtIndexPathの時にセルごとに設定する。
スポンサーサイト

UIImageの使い方

UIImageの使い方について。

UIImageのimageNamedはMainBandleからファイル名で簡単に画像をロードできます。

UIImageView *image = [UIImageView imageNamed: @"image.png"];

これは、サムネイルとか一時的に大量に表示させたい画像の時は向いていないらしい。

そんな時は

NSString *path= [[NSBundle mainBundle] pathForResource:@"star" ofType:@"png"];
UIImage *image= [[UIImage alloc] initWithContentsOfFile:path];
cell.thumb.image = image;
[image release];

のように、生成すると良い。

URLからUIImageを生成するときは一旦NSDataを作る。

NSString *path = @"http://画像のURL";
NSURL *url = [[NSURL alloc] initWithString:path];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
UIImage *image = [[UIImage alloc] initWithData: data];
cell.thumb.image = image;
[url release];
[data release];
[image release];

複数viewをスクロールviewで切り替える方法の手順

複数viewをScrollViewで切り替える方法にすごくつまづいたのでメモ。
参考サイトは下記。

iPhone アプリ UIScrollView pageControl の使い方

ViewBaseで新規作成後、SurfComViewControllerで作成。

SurfComViewController.h

#import

@interface SurfComViewController : UIViewController {
IBOutlet UIScrollView *scrollView;
IBOutlet UIPageControl *pageControl;
}

@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIPageControl *pageControl;

- (void)loadScrollViewWithPage:(int)page;
- (IBAction)changePage:(id)sender;

@end


そしたら、SurfComViewController.xibで、UIScrollViewとPageControllをそれぞれ、scrollViewアウトレットとpageControlアウトレットに接続。

PageControlのValueChangeとchangePageアクションを接続。

SurfComViewController.m

#import "SurfComViewController.h"
#import "Controller.h"

@implementation SurfComViewController
@synthesize scrollView;
@synthesize pageControl;

- (void)loadView {
[super loadView];

scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * 3, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.delegate = self;

pageControl.numberOfPages = 3;
pageControl.currentPage = 0;

[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}

- (IBAction)changePage:(id)sender {
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageControl.currentPage;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
}

- (void)scrollViewDidScroll:(UIScrollView *)sender {
CGFloat pageWidth = scrollView.frame.size.width;
pageControl.currentPage = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
}

- (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;
if (page >= 3) return;
NSLog(@"page=%d", page);
Controller *controller = [[Controller alloc] init];
controller.controllerNumber = page;

UIView *choiceView = [controller loadViewController];

CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
//NSLog(@"%d: %f", page, frame.origin.x);

choiceView.frame = frame;

[scrollView addSubview:choiceView];
[choiceView release];

}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}


- (void)dealloc {
[super dealloc];
}

@end



ViewをコントロールするControllerクラスを作成
■作成方法
 1.xcodeのグループとファイルのclassesで右クリック→追加→新規ファイルで、Objective-c classを選択
 2.クラス名はController (別でもいいけど)

Controller.h

#import


@interface Controller : UIView {
int controllerNumber;
}
@property (readwrite) int controllerNumber;

- (UIView *) loadViewController;
@end


Controller.m

#import "Controller.h"
#import "TestView1.h"
#import "TestView2.h"

@implementation Controller
@synthesize controllerNumber;

- (UIView *) loadViewController {
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(15.0f, 10.0f, 290.0f, 310.0f)];
NSLog(@"%@", view);
NSLog(@"num=%d", self.controllerNumber);

switch (self.controllerNumber) {
case 0: {
TestView1 *view1 = [[TestView1 alloc]
initWithNibName:@"TestView1"
bundle:nil];

view = view1.view;
break;
}
case 1: {
view = [[TestView2 alloc]
initWithFrame:CGRectMake(0, 0, 500, 500)];

break;
}
case 2:

break;
default:
break;
}

NSLog(@"view=%@", view);

return view;
}

- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// Initialization code
}
return self;
}

- (void)dealloc {
[super dealloc];
}

@end


あとは、表示させるviewを作成する。

■パターン1。UIViewController subclassで作る場合。(xibで配置とか出来る)
 1.xcodeのグループとファイルのclassesで右クリック→追加→新規ファイルで、Cocoa Touch classのUIViewController subclassを選択
 2.クラス名はTestView1 (別でもいいけど)
 3.xcodeのグループとファイルのclassesで右クリック→追加→新規ファイルで、User interfaceのView XIBを選択
 4.ファイル名は、TestView1とかで。
 5.xibをダブルクリックして、Interface Builderを開く
 6.View Mode(File's OwnerとかFirst Responderとかあるとこ)のViewをダブルクリックして、とりあえず色とかを赤とかに変えておく。
 7.File's OwnerでviewとViewを接続
 8.インスタンス化する。(Controller.mのswitchの中の0の時がやり方)


■パターン2。Objective-c classで作る場合。
 1.xcodeのグループとファイルのclassesで右クリック→追加→新規ファイルで、Objective-c classを選択
 2.ファイル名はTestView2とか。
 3.initWithFrameメソッドとかでself.backgroundColor = [UIColor whiteColor];を入れて背景色変える。
 4.インスタンス化する。(Controller.mのswitchの中の1の時がやり方)



これやるのに、3日間くらいかかった~
ちょっとだけ、iPhoneアプリ作成で進歩した気分!

スクリーンショットの取り方

1.「コマンド」キー + 「Shift」キー + 「3」キー    
  画面全体

2.「コマンド」キー + 「Shift」キー + 「4」キー
  ドラッグで選択した部分

3.「コマンド」キー + 「Shift」キー + 「4」キー + 「Space」キー
  カメラアイコンが表示される。カメラアイコンで選択した一つのウインドウ

カメラアイコンは、パシャって本物のカメラみたいな音がする。

デスクトップにPDFファイルとして保存される。

「'Controller' may not respond to '-loadViewController'」というエラーが出た

これは「Controller」というクラスのヘッダファイルに
「loadViewController」というメソッドの宣言が無いというWarningなので
ヘッダファイルに定義すればOK

複数のxibを作って、viewを複数作る方法。

下記サイトを参考に。

iPhoneプログラミングの基礎:View Controller

NSInternalInconsistencyException が出た時の対処法

色々いじっていたら、ビルドしてシミュレーターを立ち上げようとしたら
コンソールに下記のようなエラーが出て、立ち上がらなくなった。


Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "VCExampleViewController" nib but the view outlet was not set.'


原因は、File's Ownerのoutletにある、viewの項目が接続されていなかったから。
File's Ownerからcontrol押しながら、VIew(始めからあるViewってやつ)に向かって
ドラッグすれば接続されるので、それで直った。

知識ゼロからはじめるiPhoneアプリ開発

知識ゼロからはじめるiPhoneアプリ開発の進め方、見ておいた方が良い情報がまとめられています。

知識ゼロからはじめるiPhoneアプリ開発

androidアプリ開発入門

androidサイト作成のための入門サイトをメモ

【夏休み特別企画】Androidアプリ開発を体験しよう
→HelloWorldから、画像を表示する。xperiaにインストールする方法までを紹介。

Adress Bookの使い方

iPhoneのAdress Bookにアクセスする方法でつまづいたのでメモ。

1.AddressBook.frameworkを追加する。
 追加方法・・・xcodeの左側にある”グループとファイル”(classesとかResourcesがあるとこ)の
 frameworksのフォルダを右クリックして、追加 - 既存のフレームワークを選択する。
 色々frameworkが出てくるのでAddressBook.frameworkを選択して追加する。
 ※これをやらないと下記のようなエラーが出るかも。

"_ABRecordCopyValue", referenced from:
-[GetContactDataViewController myAction1:] in GetContactDataViewController.o
"_ABAddressBookGetPersonCount", referenced from:
-[GetContactDataViewController myAction1:] in GetContactDataViewController.o
"_kABPersonEmailProperty", referenced from:
_kABPersonEmailProperty$non_lazy_ptr in GetContactDataViewController.o
(maybe you meant: _kABPersonEmailProperty$non_lazy_ptr)
"_ABAddressBookCopyArrayOfAllPeople", referenced from:
-[GetContactDataViewController myAction1:] in GetContactDataViewController.o
"_ABMultiValueCopyValueAtIndex", referenced from:
-[GetContactDataViewController myAction1:] in GetContactDataViewController.o
"_ABAddressBookCreate", referenced from:
-[GetContactDataViewController myAction1:] in GetContactDataViewController.o
"_ABMultiValueGetCount", referenced from:
-[GetContactDataViewController myAction1:] in GetContactDataViewController.o


2.下記コードでメールが取得できる。
※ ○○○.h

#import

を追加

※ ○○○.m
アクション内に下記を追加。

//ref of Addressbook
ABAddressBookRef book = ABAddressBookCreate();

//Count of Addressbook
CFIndex cnt = ABAddressBookGetPersonCount(book);
NSLog(@"addressbook count is %d ",cnt);

//AllRecords of Addressbook
CFArrayRef records = ABAddressBookCopyArrayOfAllPeople(book);
for(int i=0;i< CFArrayGetCount(records) ;i++){
//record at index=i
ABRecordRef person = CFArrayGetValueAtIndex(records,i);
//eMail info
ABMultiValueRef emails = ABRecordCopyValue(person,kABPersonEmailProperty);
//how many email
CFIndex emlCount = ABMultiValueGetCount(emails);
for(int e=0;e //print email address
NSLog(@"addressbook %d email: %@",i,ABMultiValueCopyValueAtIndex(emails,e));
}
}


Eメール以外を取得する場合はリファレンスの「Personal Information Properties」あたりを見て、それっぽいのを

ABMultiValueRef emails = ABRecordCopyValue(person,kABPersonEmailProperty);

のkABPersonEmailPropertyの部分を変えれば良さそう。

大量データを扱う時の便利な、パーティショニング

アクセス解析とかクリック数とかをDBに保持すると大量のデータを格納しなくてはいけなくて
selectしたりするのが重くなってしまう。
そこで、mysql5.1から使えるようになった"パーティショニング"と言う機能を使うと多少は改善されそう。

以下、設定方法のメモ。

1.mysqlのパーティショニングを有効にする。
  ↓
  参考サイト
  有効にするには、mysqlの再コンパイルが必要になる。

2.月付毎にパーティションを作成する場合

CREATE TABLE logs (
id INT NOT NULL AUTO_INCREMENT,
client_name VARCHAR(32) NOT NULL,
log_data VARCHAR(1024) NOT NULL,
logged_at DATETIME NOT NULL,
PRIMARY KEY(id, logged_at),
INDEX(client_name)
) ENGINE=MyISAM
PARTITION BY RANGE( TO_DAYS(logged_at) ) (
PARTITION p200910 VALUES LESS THAN ( TO_DAYS('2009-11-01') ),
PARTITION p200911 VALUES LESS THAN ( TO_DAYS('2009-12-01') ),
PARTITION p200912 VALUES LESS THAN ( TO_DAYS('2010-01-01') )
);

※パーティショニングに使うカラム(今回の場合はlogged_at)はプライマリーキーの一部にしないといけないらしい。

これでselectとかは普通にいつも通りにすれば、条件によってそれぞれのパーティションテーブルのみ参照してくれるらしい。

3.パーティショニングを増やす方法

ALTER TABLE logs ADD PARTITION (
PARTITION p201001 VALUES LESS THAN ( TO_DAYS('2010-02-01') )
);

これしとかないと、パーティション外のデータを挿入した時にエラーとなる。
ならないようにするには毎月上記を行うか
PARTITION pmax VALUES LESS THAN MAXVALUE
を設定する。

4.どのパーティションテーブルが使われているかを確認する方法

EXPLAIN PARTITIONS SELECT * FROM logs


参考サイト
MySQLパーティショニングについて(その1:基本知識編)
15.3.4. パーティション情報の取得 | MySQL 5.1 リファレンスマニュアル

秀丸の正規表現で[test]を['test']に置換する方法

検索→ \[\f.*?\f]
置換→ \['\1'\]

■検索の方の解説
\[ ・・・ [ と一致
\f ・・・ 検索区切り
.*? ・・・ 文字列と最短一致
\f ・・・ 検索区切り
\] ・・・ ] と一致


■置換の方の解説
\[ ・・・ [ 
\1 ・・・ 検索の方で\fで区切った部分をそのまま表示させる時に使用する
\] ・・・ ] と一致

参考サイト

正規表現―タグ付き正規表現― | 秀丸エディタを使いこなす

外部スタイルシートと外部javascriptファイルの記述順序

外部スタイルシートと外部javascriptファイルの記述順序で、WEBサイトの読み込み速度が違うらしい。
1.外部スタイルシート
2.外部javacript
の順で書くようにする事。

参考サイト

外部スタイルシート(CSS)と外部JavaScriptファイルの記述順序も大切

プロフィール

U2K

Author:U2K
いろいろプログラムに関しての覚え書きをちょくちょくと書いていきます。

オススメ










オススメ

忍者AdMax

u2k on Twitter

最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。