-3

これが私のテーブルビューの外観です。 テーブルビュー

これが私のコードです バグのある画像 ViewController.hを下にスクロールするとこうなります

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>

{
    NSMutableArray *items ;

}
@property (nonatomic,retain) NSMutableArray *items ;
@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize items;
- (void)viewDidLoad
{
    [super viewDidLoad];

    items = [[NSMutableArray alloc] init];
    [items addObject:@"bla bla bla"];
    [items addObject:@"rikifhdif bla bla"];
    [items addObject:@"bla sdfkndskfnlk bla"];
    [items addObject:@"sdf,nsdmf bla bla"];
    [items addObject:@"sdjkfhksd bla bla"];
    [items addObject:@"dkfhkusd bla bla"];
    [items addObject:@"bla sdfjknskdjf bla"];
    [items addObject:@"kiidrfjifig jjojdjfgdfgjjdjsjkhksidfl"];
    [items addObject:@"mksjdhf ysdgjg bla"];
    // Do any additional setup after loading the view, typically from a nib.
}
#pragma tableview logic
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 6;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if(section == 0)
    {
        return @"Title0";
    }
    else if(section == 1)
    {
        return @"Title1";
    }
    else if(section == 2)
    {
        return @"Title2";
    }
    if(section == 3)
    {
        return @"Title3";
    }
    else if(section == 4)
    {
        return @"Title4";
    }
    else 
    {
        return @"Title5";
    }
    }
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section==0) {
        return 3;
    }
    if (section==1) {
        return 1;
    }
    if (section==2) {
        return 2;
    }
    if (section==3) {
        return 2;
    }
    if (section==4) {
        return 1;
    }
    if (section==5) {
        return 1;
    }

    return 1;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.textLabel.text = [items objectAtIndex:indexPath.row];
    cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];
    switch (indexPath.section) {
        case 0:

            if (indexPath.row==1) {
                [[cell imageView] setHidden:YES];
            }
            if (indexPath.row==2) {
                [[cell imageView] setHidden:YES];
            }

            break;
        case 1:
            if (indexPath.row==1) {
                [[cell imageView] setHidden:YES];

            }
            if (indexPath.row==2) {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 2:
            if (indexPath.row==1) {
                [[cell imageView] setHidden:YES];

            }
            if (indexPath.row==2) {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 3:
            if (indexPath.row==1) {
                [[cell imageView] setHidden:YES];
            }
            if (indexPath.row==2) {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 4:
            if (indexPath.row==1) {
                [[cell imageView] setHidden:YES];
            }
            if (indexPath.row==2) {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 5:
            if (indexPath.row==1) {
                [[cell imageView] setHidden:YES];
            }
            if (indexPath.row==2) {
                [[cell imageView] setHidden:YES];
            }
            break;

        default:
            break;
    }

    return cell;
    //}
}

- (void)dealloc {
    [items release], items = nil;
    [super dealloc];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

すべてのセクションの最初の行の画像を表示したいだけです。ロード時の出力は問題ありませんが、ビューをスクロールすると最初の画像が消えます。この問題を解決するにはどうすればよいですか?? どんな助けでも大歓迎です。よろしくお願いします。

4

4 に答える 4

3

UITableViewセルを再利用するため、下にスクロールすると画像が消えます。たとえば、最初のセクションの行 1 で、セルを要求し、その画像を非表示にしたとします。

case 0:
    if (indexPath.row==1) {
        [[cell imageView] setHidden:YES];
    }

後で下にスクロールするUITableViewと、セルが使用されなくなったことを知るのに十分スマートであり (画面に表示されなくなったため)、ビューの下に表示される新しい行にセルを再利用します。画像を非表示にしたので、非表示になります。ここで重要なのは、新しいセルが作成されず、古いセルのみが再利用され、その状態が変更されていないことです。

これを修正するには、次のケースを追加しrow == 0ます。

case 0:
    if (indexPath.row==0) {
        [[cell imageView] setHidden:NO];
    }
    else if (indexPath.row == 1) {
        [[cell imageView] setHidden:YES];
    }
    else ...

より明確な構文をお勧めします。

case 0:
    cell.imageView.hidden = indexPath.row != 0;

または、すべてのセクションのすべての最初の行の画像のみが必要な場合:

cell.imageView.hidden = indexPath.row != 0 // No need of case expression
于 2013-06-22T10:54:21.477 に答える
2

すでに Index-Path.row のように画像を非表示に設定しています:-

たとえば、セクション1を if (indexPath.row==1) { [[cell imageView] setHidden:YES];}同じように設定しif (indexPath.row==2)たため、セクション1が最初の0番目のインデックス行の画像のみを表示し、その他が表示されません。

case 0:

    if (indexPath.row==0) {
        [[cell imageView] setHidden:NO];
    }
    else{
        [[cell imageView] setHidden:YES];
    }

cellForRowAtIndexPathコードを次のcellForRowAtIndexPathメソッドに置き換えるだけです

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = [NSString stringWithFormat:@"%d_%d",indexPath.section,indexPath.row];   //uniq identifire for each section with it's row

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    switch (indexPath.section) {
        case 0:
           cell.textLabel.text = [items objectAtIndex:indexPath.row];
           cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];

            if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];
            }
            else {
                [[cell imageView] setHidden:YES];
            }

            break;
        case 1:
             cell.textLabel.text = [items objectAtIndex:indexPath.row];
             cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];

            if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];
            }
            else {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 2:

              cell.textLabel.text = [items objectAtIndex:indexPath.row];
              cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];

           if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];
            }
            else {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 3:

             cell.textLabel.text = [items objectAtIndex:indexPath.row];
              cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];

           if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];
            }
            else {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 4:

             cell.textLabel.text = [items objectAtIndex:indexPath.row];
             cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];
            if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];
            }
            else {
                [[cell imageView] setHidden:YES];
            }
            break;
        case 5:

             cell.textLabel.text = [items objectAtIndex:indexPath.row];
             cell.imageView.image = [UIImage imageNamed:@"Star.jpg"];

            if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];
            }
            else {
                [[cell imageView] setHidden:YES];
            }
            break;

        default:
            break;
    }

    return cell;
    //}
}

次のように CellIdentifier を作成します:-

 NSString *CellIdentifier = [NSString stringWithFormat:@"%d_%d",indexPath.section,indexPath.row];   //uniq identifire for each section with it's row
于 2013-06-22T10:27:31.517 に答える
0

テーブルビューセルが表示されたときにセルをロードするには、このコードをすべて追加するだけです case 0: 10 case 5:

if (indexPath.row==0) {
                [[cell imageView] setHidden:NO];  
            }

すべてのケースで、次のようにコードを削減することをお勧めします。

if (indexPath.row==0) {
            [[cell imageView] setHidden:NO];
        }
        else {
            [[cell imageView] setHidden:YES];
        }
于 2013-06-22T10:33:38.887 に答える
-1

以下の変更を行うことで解決しました。しかし、それが正しいことかどうかはわかりません。

//if(cell == nil) 
//{


    //}

私がしたことは、セルがnilかどうかをチェックするセル条件をコメントアウトすることです。

于 2013-06-22T11:07:02.493 に答える