7856


`TableView`をスクロールするとレイアウトがぐちゃぐちゃになってしまい、調べた結果それはセルの再描画によるものらしいので`TableView`をスクロールしてもセルを再描画したくないのですが、どうすればよろしいでしょうか？  
ちなみに

[code]

    for (UIView *subview in [cell.contentView subviews]) {
        [subview removeFromSuperview];
    }
    
[/code]

としても各セルの内容が全て消えてしまいうまくいきませんでした。  
セルの数もあまりないので、とりあえず今の段階では再描画させない方法が知りたいです。  
各セルにはカスタムセルを使っています。  
どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。


CC BY-SA 3.0
2015-03-12T08:43:09.593
7832
2015-03-13T02:17:27.883
5210
question
objective-c uitableview
TableViewのセルの内容を再描画したくない


UITableViewにはリサイクル機構があり、`tableView(tableView: UITableView,
cellForRowAtIndexPath indexPath: NSIndexPath) ->
UITableViewCell`で`addSubView`などをしていると表示が崩れる場合があります。表示数が少ないのであれば、リサイクルさせない様にする方法はどうでしょう。(その都度、生成させるようにする方法です。)

[code]

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = [NSString stringWithFormat:@"cell%d",indexPath.row]
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }
    }
    
[/code]

`Identifier`をバラバラにすることで、`row`の数分生成されるはずです。  
数が多い場合は、重くなるので素直に`UITableView`のサブクラスを作る事をオススメします。


CC BY-SA 3.0
2015-03-13T01:10:12.793
7854
2015-03-13T02:17:27.883
2015-03-13T02:17:27.883
4551
4551
7832
answer


**セルの再描画は止められない** ことについて、説明します。まずは、検証用のサンプルコードです。

[code]

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController {
        int cellNumber;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        cellNumber = 1;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 100;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Cell" forIndexPath:indexPath];
        if (cell.tag == 0) {
            cell.tag = cellNumber++;
        }
        cell.textLabel.text = [NSString stringWithFormat: @"Cell's tag = %ld", cell.tag];
    
        return cell;
    }
    
    @end
    
[/code]

なにをやっているコードかというと、セルが初めて生成されたときに、プロパティtagに連番で整数値を代入し、textLabelにtagの値を表示するというものです。  
シミュレータで実行したとき、テーブルビューに表示される行数は、15行でしたが、tagの番号は17までで止まり、スクロールすると、1〜17までの番号がくり返し出てくるだけという結果になりました。なお、総行数は100に設定してあります。  
これは、表示行数に2足した数だけのセルが作られ、スクロールすると、枠から出て行ったセルが、つぎつぎ再利用されてまた現れるというメカニズムを、視覚化しています。  
セルが枠から出て行ったら、すぐに「再描画」される、というのが実態であることが、わかっていただけると思います。

正攻法でいきましょうよ。


CC BY-SA 3.0
2015-03-13T01:39:54.943
7856
2015-03-13T01:39:54.943
7362
7832
answer