0

サブクラス化されたプロトタイプセルで作成されたテーブルビューを管理するためのUITableViewControllerがあります。最も関連するコードは次のとおりです。

MyCell.h

#import <UIKit/UIKit.h>
@interface ScrollViewTableCellInShorTrip : UITableViewCell
@end

MyCell.m

#import "MyCell.h"
@implementation SMyCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    // Initialization code
}
return self;
}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 
{   
NSLog(@"touch cell");
[super touchesEnded: touches withEvent: event];

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
}
}
@end

TableViewController.h

#import <UIKit/UIKit.h>

@interface TableViewController : UITableViewController{
}
@property (nonatomic, retain) NSArray *arr;
@end

TableViewController.m

#import "TableViewController.h"
#import "MyCell.h"
@implementation ATripTableViewController
@synthesize arr;

- (void)viewDidLoad
{
[super viewDidLoad];
self.arr = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CellIdentifier = @"myCell";
MyCell *myCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

return myCell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [self performSegueWithIdentifier:@"detailView"sender:self];     
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{    
if ([[segue identifier] isEqualToString:@"detailView"]){
   NSLog(@"arr acount is %d", self.arr.count);//program received signal: "EXC_BAD_ACCESS".
}   
}

prepareForSegue:sender:メソッドで "NSLog(@" arr acount is%d "、self.arr.count)"を呼び出すと、EXC_BAD_ACCESSエラーメッセージが表示されます。プロパティ「arr」が現在無料であることは明らかです。そして、この状況は、サブクラス化されたUITableViewCellを使用した場合にのみ表示されます。

答えに感謝します!

4

2 に答える 2

3

NSLog(@"arr acount is %d", self.arr.count);に置き換えますNSLog(@"arr acount is %d",arr.count);

self の定義:
self は、現在実行中のメソッド (!) を呼び出したメッセージを受け取ったオブジェクトへのポインタである特別な変数です。つまり、メッセージの受信者です。

self.objectオブジェクト内でオブジェクトを直接呼び出すのではなく、呼び出す必要が ある場合。

self.object = obj;
object = obj;

これら 2 つの呼び出しの違いは、self.object への呼び出しが @synthesize ディレクティブによって生成されたアクセサーを利用することです。オブジェクトを直接呼び出すと、これらのアクセサ メソッドがバイパスされ、インスタンス変数が直接変更されます。

于 2012-05-10T04:36:05.140 に答える
2

count はオブジェクトではなくプリミティブ (整数) です。%@ のように参照しているためです。代わりに %i を使用してください。

于 2012-05-09T18:45:45.303 に答える