Simple Table(5)~サンプルコードとの差異

2010. 11. 03
旧版の本書内容とApress社のサイト内のサンプルコードで異なる点がいくつかあるので、差異を確認してみます。


●viewDidUnload

本書では触れられていませんが、サンプルコードにはviewDidUnloadメソッドにlistData配列の所有権の放棄が追加されています。
(太字が異なる部分)

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

    self.listData = nil;
    [super viewDidUnload];
}

898

定型文っぽいものなのですが、つい忘れてしまいます。

ここではオブジェクトを解放する処理なので、実装時とは逆にスーパークラスによる初期化を最後に行います。


●tableView:cellForRowAtIndexPath:

tableView:cellForRowAtIndexPath:メソッド内では、先に説明したように旧版の内容にiOS 3.0以降非推奨のメソッドがあるので、『#ifdef __IPHONE_3_0 ~ #else ~ #endif』で排他制御を行っています。

が、制御文の外でiOS 3.0以降で利用可能なメソッドの記述があったりと若干不可解な点もあります。
(太字が異なる部分)

- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
        SimpleTableIdentifier];
    if (cell == nil) {
#ifdef __IPHONE_3_0
    // Other styles you can try
    // UITableViewCellStyleSubtitle
    // UITableViewCellStyleValue1
    // UITableViewCellStyleValue2


    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier: SimpleTableIdentifier] autorelease];
#else
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero
        reuseIdentifier: SimpleTableIdentifier] autorelease];
#endif


    }

    UIImage *image = [UIImage imageNamed:@"star.png"];
    UIImage *image2 = [UIImage imageNamed:@"star2.png"];
    cell.imageView.image = image;
    cell.imageView.highlightedImage = image2;

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    cell.textLabel.font = [UIFont boldSystemFontOfSize:50];

#ifdef __IPHONE_3_0
    if (row < 7)
        cell.detailTextLabel.text = @"Mr. Disney";
    else
        cell.detailTextLabel.text = @"Mr. Tolkein";
#endif

    return cell;
}

899

最初の排他制御は『Simple Table(1)~テキストの表示』で紹介している部分で、iOS 3.0以降非推奨のinitWithFrame:reuseIdentifier:メソッドとiOS 3.0以降で使えるinitWithStyle:reuseIdentifier:メソッドを切り替えています。

画像の処理部分では『star2.png』を追加して、highlightedImageプロパティで行をタップした時に画像が変わるようになっています。

ここで使用されているimageViewhighlightedImageの両プロパティはiOS 3.0以降で使用可能なので、本当はimageプロパティ(UITableViewCellクラス)との排他処理した方がいいと思われます。
imageプロパティ(UIImageViewクラス)はiOS 2.0以降で使用可能です)

また、その後のtextLabelプロパティもiOS 3.0以降で使用可能だったりしますので、textプロパティ(UITableViewCellクラス)との排他処理になります。
textUILabelクラス)とfontプロパティはiOS 2.0以降で使用可能です)

最後の排他処理ではdetailTextLabelメソッドで詳細ラベルの設定を行っていますが、Cell StyleがデフォルトのUITableViewCellStyleDefaultになっているので、このままでは詳細ラベルの表示がされません。

900

スタイルをUITableViewCellStyleSubtitleなどのUITableViewCellStyleDefault以外に変更すると、詳細ラベルが表示されます。
(下図ではフォントサイズを30にしています。)

901


highlightedImage

@property(nonatomic, retain) UIImage *highlightedImage

イメージビューに強調画像を表示します。

このプロパティの初期値は、initWithImage:highlightedImage:メソッドでの画像が渡されるか、レシーバを異なるメソッドを使って初期化した場合にはnilになります。

highlightedAnimationImagesプロパティにnil以外の値が含まれている場合、このプロパティの値は使用されません。


detailTextLabel

@property(nonatomic, readonly, retain) UILabel *detailTextLabel

テーブルセルに二次ラベルが存在する場合に返します。
(読み込みのみ)

セルの二次(または詳細)ラベルを保持します。

UITableViewCellは二次ラベルをサポートするスタイルのセルを生成し、適したラベルを追加します。

スタイルが詳細ラベルをサポートしていない場合はnilを返します。

現在定義されているセルスタイル内の主なラベルに付いては『Cell Styles』を参照してください。


●didSelectRowAtIndexPath:

didSelectRowAtIndexPath:メソッドでは、最後にdeselectRowAtIndexPath:animated:メソッドが追加され、行選択解除時にアニメーションを行うようになっています。
(太字が異なる部分)

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];
    NSString *rowValue = [listData objectAtIndex:row];

    NSString *message = [[NSString alloc] initWithFormat:
        @"You selected %@", rowValue];
    UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle:@"Row Selected!"
        message:message
        delegate:nil
        cancelButtonTitle:@"Yes I Did"
        otherButtonTitles:nil];
    [alert show];

    [message release];
    [alert release];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

902


deselectRowAtIndexPath:animated:

- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated

インデックスパスで識別された行が選択解除された時に、選択解除をオプションでアニメーションすることができます。

このメソッドを呼び出すと、デリゲートはtableView:willSelectRowAtIndexPath:tableView:didSelectRowAtIndexPath:のメッセージを受け取らず、そのためオブザーバにUITableViewSelectionDidChangeNotification通知を送信しません。

indexPath:レシーバの行を識別するインデックスパスを指定します。

animated:選択解除時にアニメーションを行う場合にはYES、すぐに変更を行う場合にはNOを指定します。



参考文献

UIImageView Class Reference

UITableViewCell Class Reference

UITableView Class Reference

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る






Wave SoundTouch music system IV
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Wave SoundTouch music system IV
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR