Hatena::ブログ(Diary)

ちくわプログラマにっき このページをアンテナに追加 RSSフィード

【本を書きました!】iOSプログラミング逆引きリファレンス108

会社の同僚といっしょに本を書きました。

iOSアプリ開発中に遭遇するよくある疑問をレシピ形式でまとめた本です。iOS4の新機能も満載です。iOSアプリ開発のお供にどうぞ!

2010-07-12

[]TapkuLibraryのカレンダーを使ってみた

自分用のメモとして、とりあえずコードだけ貼っておく。「+」ボタンを押すとメモに「とんかつ」と記録できるカレンダーです。

#import <UIKit/UIKit.h>
#import "TapkuLibrary/TapkuLibrary.h"

@interface MyCalendarViewController : TKCalendarMonthTableViewController {
	NSMutableDictionary	*memoDictionary;
}

@end
#import "MyCalendarViewController.h"

@implementation MyCalendarViewController

- (void)didAddButtonPush {
	NSDate *date = [self.monthView dateSelected];
	if (date) {
		NSMutableArray *memos = [memoDictionary objectForKey:date];
		if (!memos) {
			memos = [NSMutableArray array];
			[memoDictionary setObject:memos forKey:date];
		}
		[memos addObject:@"とんかつ"];
	}
	
	// カレンダーとテーブルをリロード
	[self.monthView reload];
	[self.tableView reloadData];
}

#pragma mark カレンダー関連

// 選択した期間内でのドットマークの有無を返す
- (NSArray*) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate{
	NSMutableArray *marks = [NSMutableArray array];
	
	NSDate *d = startDate;
	while (YES) {
		// 終了判定
		if ([d compare:lastDate] == NSOrderedDescending) {
			break;
		}
		
		// メモがある場合にはYESを、無い場合にはNOをセットする
		id memos = [memoDictionary objectForKey:d];
		if (memos) {
			[marks addObject:[NSNumber numberWithBool:YES]];
		} else {
			[marks addObject:[NSNumber numberWithBool:NO]];
		}
		
		// 日付を1日すすめる
		TKDateInformation dateInfo = [d dateInformation];
		dateInfo.day++;
		d = [NSDate dateFromDateInformation:dateInfo];
	}
	
	return marks;
}

- (void) calendarMonthView:(TKCalendarMonthView*)monthView didSelectDate:(NSDate*)d{
	[self.tableView reloadData];
}

- (void) calendarMonthView:(TKCalendarMonthView*)mv monthDidChange:(NSDate*)d{
	[super calendarMonthView:mv monthDidChange:d];
	[self.tableView reloadData];
}


#pragma mark カレンダーテーブル関連

// セクション数は常に1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
	return 1;
}

// 選択した日のメモの個数を返す
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
	NSDate *date = [self.monthView dateSelected];
	if (date) {
		NSMutableArray *memos = [memoDictionary objectForKey:date];
		if (memos) {
			return [memos count];
		} else {
			return 0;
		}
	} else {
		return 0;
	}
}

// 選択した日のメモの書かれたセルを返す
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    
    // メモを返す
	NSArray *memos = [memoDictionary objectForKey:[monthView dateSelected]];
	cell.textLabel.text = [memos objectAtIndex:indexPath.row];
	
    return cell;
}

#pragma mark UIViewController

- (void)viewDidLoad {
    [super viewDidLoad];
	
	// メモを初期化
	memoDictionary = [[NSMutableDictionary alloc] init];
	
	// 追加ボタンをナビゲーションバーへ
	UIBarButtonItem *addButton = [[UIBarButtonItem alloc] 
								  initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 																						   
								  target:self  								  																		   
								  action:@selector(didAddButtonPush)];
	self.navigationItem.rightBarButtonItem = addButton;
}

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


@end

tkstmttkstmt 2012/04/10 23:42 突然のコメント失礼します。教えていただけると助かります。
TapkuLibraryを使用できるようにして、テストでコードを使わせていただいたのですが、
+ボタンが表示されません。TapkuLibraryの準備と上記コード以外になにか必要なことがあるのでしょうか。自分なりにネット等で検索もしてみたのですが、方法がわかりません。
よろしくお願いします。

thatathata 2012/04/11 00:59 ここのコードはナビゲーションコントローラを使って表示されること前提のコードになってしまっているので、ナビゲーションコントローラを使ってMyCalendarViewControllerを表示してみてください。「+」ボタンが表示されるはずです。

tkstmttkstmt 2012/04/11 23:27 早速の返信ありがとうございます。試してみます。
試したら、また結果報告させていただきます。

tkstmttkstmt 2012/04/16 23:57 アドバイスをいただいたので、

>ナビゲーションコントローラを使ってMyCalendarViewControllerを表示してみてください。

の意味をネットで調べてみましたが、正直どうしたらいいのかわかりませんでした。
具体的にはどうすることをいうのでしょうか。
何度も申し訳ありませんが、教えていただけませんか。
よろしくお願いします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証