0

UITableViewがあり、次のコードでセルを拡張/縮小します。最後の2つのindexPathを保存して実行reloadRowsAtIndexPaths:します。

ここで、セクション0のヘッダーにを追加しましUISearchBarた。searchBarをタブで移動すると、UITableViewの上にキーボードが表示されます。これまでのところ良好です。

しかし、ユーザーがセルに触れてキーボードを無効にできるようにしたいと思います。そうするために、私は検索ボックスが内部の最初のレスポンダーであるかどうかをテストします-tableView:didSelectRowAtIndexPath:

ただし、そうすると、行マーク1、2、3の1つに「SIGKILL」が表示されます。

理由がよくわかりません

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Article *article = [articles objectAtIndex:indexPath.row];
    ArticleCell *cell = (ArticleCell*)[self.tableView dequeueReusableCellWithIdentifier:@"articelcell"];

    if (cell == nil) 
    {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"ExtendibleCell" owner:self options:nil] objectAtIndex:0];
    }

    //....  
    cell.articleName.text = [NSString stringWithFormat:@"%@",article.name ];
    return cell;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if ([searchBar isFirstResponder]) {
        [searchBar resignFirstResponder];
    }

    [orderTableDelegate receiveSelectedArticleName:[[articles objectAtIndex:indexPath.row] name]];
    firstSelected = lastSelected;
    lastSelected = indexPath;
    if (lastSelected == firstSelected && firstSelected != nil) {

        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:lastSelected] withRowAnimation:CELL_ANIMATION]; //1
        lastSelected = nil;
        firstSelected = nil;
        return;
    }

    if (lastSelected != nil) {
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:CELL_ANIMATION];//2
    }

    if (firstSelected != nil) {
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:firstSelected] withRowAnimation:CELL_ANIMATION];//3
    }
}



-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section ==0) {
        if (searchBar == nil) {
            searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
            [searchBar setShowsBookmarkButton:YES];
            [searchBar setKeyboardType:UIKeyboardTypeAlphabet];
            [searchBar setBarStyle:UIBarStyleBlack];
            [searchBar setShowsCancelButton:YES];
            [searchBar setDelegate:self];
        }
        return searchBar;
    }
    return nil;
}


-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([indexPath isEqual:lastSelected] && lastSelected!=firstSelected) {
        return [[(Article *)[articles objectAtIndex:indexPath.row] sizesAndPrices] count]*PACKAGESIZE_PRICE_BUTTON_HEIGHT +30;
    }
    return 40.0;
}

編集 コードをクリーンアップしました-tableView:didSelectRowAtIndexPath:が、問題は同じままです

@property(nonatomic,retain) NSIndexPath *firstSelected;
@property(nonatomic,retain) NSIndexPath *lastSelected;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [orderTableDelegate receiveSelectedArticleName:[[articles objectAtIndex:indexPath.row] name]];
    self.firstSelected = nil;
    self.firstSelected = self.lastSelected;
    self.lastSelected = nil;
    self.lastSelected = [indexPath retain];

    if (self.firstSelected == self.lastSelected) {
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:self.firstSelected] withRowAnimation:CELL_ANIMATION];
        [self.firstSelected release];
        [self.lastSelected release];
        self.firstSelected = nil ;
        self.lastSelected = nil ;
    } else {
        if (self.firstSelected != nil) {

            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:self.firstSelected] withRowAnimation:CELL_ANIMATION];

        }

        if (self.lastSelected != nil) {

            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:self.lastSelected] withRowAnimation:CELL_ANIMATION];


        }
    }


    if ([searchBar isFirstResponder]) {
        [searchBar resignFirstResponder];
    }
}
4

1 に答える 1

0
   firstSelected = lastSelected;
    lastSelected = indexPath;

これにより、lastSelectedはインスタンス変数であると私は信じますか?この場合、適切に保持されておらず、このメソッドの範囲を超えて存続しているという保証はありません。didSelectRowAtIndexPath:引数で渡されたindexPathは、実行後に使用する場合は保持する必要があります。

その場合は、そのメソッド全体でより優れたメモリ管理が必要になることに注意してください。つまり、値を変更したりnilに設定したりする前に、lastSelectedを解放します。

firstSelectedとlastSelectedがインスタンス変数であると仮定すると、次のようなことができます。(プロパティを保持してセッターを使用すると、すべてのリリースと!=チェックがなくなります)


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if ([searchBar isFirstResponder]) {
        [searchBar resignFirstResponder];
    }

    [orderTableDelegate receiveSelectedArticleName:[[articles objectAtIndex:indexPath.row] name]];

    if (firstSelected != lastSelected) {
        [firstSelected release];
        firstSelected = [lastSelected retain];
    }

    if (lastSelected != lastSelected) {
        [lastSelected release];
        lastSelected = [indexPath retain];
    }

    if (lastSelected == firstSelected && firstSelected != nil) {

        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:lastSelected] withRowAnimation:CELL_ANIMATION]; //1
        [lastSelected release];
        lastSelected = nil;
        [firstSelected release];
        firstSelected = nil;
        return;
    }

    if (lastSelected != nil) {
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:CELL_ANIMATION];//2
    }

    if (firstSelected != nil) {
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:firstSelected] withRowAnimation:CELL_ANIMATION];//3
    }
}

于 2010-08-23T21:26:47.440 に答える