3

iPad: セルが表示領域 (画面の高さ) を超えるまで正常に動作するテーブルがあります。部分的に画面外にある最後のセルが下にスクロールされて表示されなくなってから上にスクロールすると、アプリがクラッシュしますか? なんで?

コードは正常に動作する iPhone 画面から転用されています (これはユニバーサル アプリです)。これに困惑

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"JobCell";

    UITableViewCell *cell;
    NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];

    if ( 6 <= [[versionCompatibility objectAtIndex:0] intValue] )
    {
        // iOS6 is installed
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    }
    else
    {
        // iOS5 is installed
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier ];
    }


    // Configure the cell...
    Job *job = [self.jobs objectAtIndex:indexPath.row];

    NSLog(@"Dealing with cell %d",indexPath.row);

    UIColor *redcol = [UIColor colorWithRed:0.62745098039216 green:0.15294117647059 blue:0.15686274509804 alpha:1.0];

    NSString *jobString = job.jobAddress;
    jobString = [jobString stringByAppendingString:@", "];
    jobString = [jobString stringByAppendingString:job.jobPostcode];

    //cell.textLabel.text = jobString;

    NSLog(@"jobString %@",jobString);

    UILabel *jobLabel = (UILabel *)[cell.contentView viewWithTag:10];
    jobLabel.text = jobString;

    int jobsaved = job.jobSaved;

    if (jobsaved == 1)
    {
        //cell.textLabel.textColor = redcol;
        jobLabel.textColor = redcol;
    }
    else
    {
        //cell.textLabel.textColor = [UIColor blackColor];
        jobLabel.textColor = [UIColor blackColor];
    }

    NSLog(@"date %@",job.jobDate);

    UILabel *dateLabel = (UILabel *)[cell.contentView viewWithTag:11];

    if (! [job.jobDate isEqualToString:@""]) {


        NSDateFormatter *formater = [[NSDateFormatter alloc] init];
        [formater setDateFormat:@"yyyy-MM-dd"];

        NSDate *date2 = [formater dateFromString:job.jobDate];
        [formater setDateFormat:@"d MMM YYYY"];

        NSString *date = [formater stringFromDate:date2];

        //cell.detailTextLabel.text = date;
        dateLabel.text = date;

    }
    else
    {
        //cell.detailTextLabel.text = @"";
        dateLabel.text = @"";
    }

    UIButton *mapBtn = (UIButton *)[cell viewWithTag:12];
    [mapBtn addTarget:self action:@selector(showMap:) forControlEvents:UIControlEventTouchUpInside];
    mapBtn.tag = indexPath.row;

    return cell;
}

エラーは

 -[UIButton setText:]: unrecognized selector sent to instance 0x2aba90
2013-07-04 09:32:48.563 ESC GasCert[3175:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton setText:]: unrecognized selector sent to instance 0x2aba90'
*** First throw call stack:
(0x37e208bf 0x3796c1e5 0x37e23acb 0x37e22945 0x37d7d680 0x6e0e3 0x319289cb 0x31927aa9 0x31927233 0x318cbd4b 0x37d7f22b 0x37419381 0x37418f99 0x3741d11b 0x3741ce57 0x374446f1 0x374674c5 0x37467379 0x34b76f93 0x3764e891 0x37de9f43 0x37df4553 0x37df44f5 0x37df3343 0x37d764dd 0x37d763a5 0x37b4dfcd 0x318f6743 0x22f1 0x2278)
terminate called throwing an exception(lldb)

クラッシュ

0x217a:  blx    0xa7ef8                   ; symbol stub for: NSStringFromClass
0x217e:  mov    r7, r7
0x2180:  blx    0xa7f8c                   ; symbol stub for: objc_retainAutoreleasedReturnValue
0x2184:  movs   r2, #0
0x2186:  movt   r2, #0
0x218a:  ldr    r1, [sp, #8]
0x218c:  str    r0, [sp]
0x218e:  mov    r0, r1
0x2190:  ldr    r1, [sp, #4]
0x2192:  ldr    r3, [sp]
0x2194:  blx    0xa7ed8                   ; symbol stub for: UIApplicationMain
0x2198:  str    r0, [sp, #32]

私はもう試した

.h

@property (nonatomic, copy) NSString *jobString;

.m

_jobString = job.jobAddress;
_jobString = [_jobString stringByAppendingString:@", "];
_jobString = [_jobString stringByAppendingString:job.jobPostcode];

編集:

これは、クラッシュしない iPhone ストーリーボードのコードです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"JobCell";

    UITableViewCell *cell;
    NSArray *versionCompatibility = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];

    if ( 6 <= [[versionCompatibility objectAtIndex:0] intValue] )
    {
        // iOS6 is installed
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    }
    else
    {
        // iOS5 is installed
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier ];
    }

    // Configure the cell...
    Job *job = [self.jobs objectAtIndex:indexPath.row];

    UIColor *redcol = [UIColor colorWithRed:0.62745098039216 green:0.15294117647059 blue:0.15686274509804 alpha:1.0];

    NSString *jobString = job.jobAddress;
    jobString = [jobString stringByAppendingString:@", "];
    jobString = [jobString stringByAppendingString:job.jobPostcode];    

    //cell.textLabel.text = jobString;

    UILabel *jobLabel = (UILabel *)[cell viewWithTag:10];
    jobLabel.text = jobString;

    int jobsaved = job.jobSaved;

    if (jobsaved == 1)
    {
        //cell.textLabel.textColor = redcol;
        jobLabel.textColor = redcol;
    }
    else
    {
        //cell.textLabel.textColor = [UIColor blackColor];
        jobLabel.textColor = [UIColor blackColor];
    }

    NSLog(@"date %@",job.jobDate);

    UILabel *dateLabel = (UILabel *)[cell viewWithTag:11];

    if (! [job.jobDate isEqualToString:@""]) {


        NSDateFormatter *formater = [[NSDateFormatter alloc] init];
        [formater setDateFormat:@"yyyy-MM-dd"];

        NSDate *date2 = [formater dateFromString:job.jobDate];
        [formater setDateFormat:@"d MMM YYYY"];

        NSString *date = [formater stringFromDate:date2];

        //cell.detailTextLabel.text = date;
        dateLabel.text = date;

    }
    else
    {
        //cell.detailTextLabel.text = @"";
        dateLabel.text = @"";
    }

    UIButton *mapBtn = (UIButton *)[cell viewWithTag:12];
    [mapBtn addTarget:self action:@selector(showMap:) forControlEvents:UIControlEventTouchUpInside];
    mapBtn.tag = indexPath.row;

    return cell;
}

編集:

タグの方法論を使用して決定された全体は、問題をはらんでいます。この投稿のソリューションを使用して問題を解決しました UITableView で押された UIButton の検出

4

2 に答える 2

8

私はあなたがタグを台無しにしていると思います、ここに私が見ているもの があります: は の代わりにによって取得される可能性があるため、そのように をmapBtn.tag = indexPath.row;書き直すべきではありません。tagUIButtonviewWithTagUILabel[UIButton setText:].

したがって、アクションをマークする別の方法を見つける必要があります。

于 2013-07-04T08:49:41.150 に答える
-2

使用するiOS 5の場合

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

nil識別子 でセルを初期化していないため、これは を返すことに注意してくださいCellIdentifierdequeueReusableCellWithIdentifier:forIndexPath:常に有効なセルを返しますが、セルを初期化する必要があるためですdequeueReusableCellWithIdentifier:(デキューするものが何もない場合)。

したがって、(バージョン < iOS6) に nil を返している- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathため、覚えている限りではクラッシュが発生します。

ドキュメントの段落は次のとおりです。

戻り値

関連付けられた識別子を持つ UITableViewCell オブジェクト、または再利用可能なセル キューにそのようなオブジェクトが存在しない場合は nil。

于 2013-07-04T09:01:13.150 に答える