web-dev-qa-db-ja.com

UITableViewの単一のUITableViewCellを更新することは可能ですか?

UITableViewsを使用するカスタムUITableViewCellがあります。各UITableViewCellには2つのボタンがあります。これらのボタンをクリックすると、セル内のUIImageViewの画像が変更されます。

新しい画像を表示するために各セルを個別に更新することは可能ですか?どんな助けも大歓迎です。

175
Wizard Of iOS

セルのindexPathを取得したら、次のようなことができます。

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

Xcode 4.6以降では:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

もちろん、アニメーション効果として好きなものを設定できます。

317
Romain

-[UITableView cellForRowAtIndexPath:]を呼び出してみましたが、うまくいきませんでした。しかし、例えば、私にとっては次のように機能します。 I allocおよびreleaseは、NSArrayを使用して厳密なメモリ管理を行います。

- (void)reloadRow0Section0 {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [indexPaths release];
}
34
ma11hew28

迅速:

func updateCell(path:Int){
    let indexPath = NSIndexPath(forRow: path, inSection: 1)

    tableView.beginUpdates()
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
    tableView.endUpdates()
}
20
Esqarrouth

reloadRowsAtIndexPaths:は問題ありませんが、それでもUITableViewDelegateメソッドを強制的に起動します。

私が想像できる最も簡単なアプローチは次のとおりです。

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath];

重要メインスレッドでconfigureCell:実装を呼び出すのは、非UIスレッドでは機能しませんreloadData/reloadRowsAtIndexPaths:と同じ話)です。以下を追加すると役立つ場合があります。

dispatch_async(dispatch_get_main_queue(), ^
{
    [self configureCell:cell forIndexPath:indexPath];
});

また、現在表示されているビュー以外で行われる作業を避けることも価値があります。

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound;
if (cellIsVisible)
{
    ....
}
18
Maciek Czarnik

カスタムTableViewCellsを使用している場合、ジェネリック

[self.tableView reloadData];    

この質問に効果的に答えません現在のビューを離れない限りから戻ってきます。最初の答えもありません。

最初のテーブルビューセルを正常に再読み込みするには、ビューを切り替えずにを使用します。次のコードを使用します。

//For iOS 5 and later
- (void)reloadTopCell {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

次のrefresh methodを挿入します。これにより、上記のメソッドが呼び出され、トップセル(または必要に応じてテーブルビュー全体)のみをカスタムリロードできます。

- (void)refresh:(UIRefreshControl *)refreshControl {
    //call to the method which will perform the function
    [self reloadTopCell];

    //finish refreshing 
    [refreshControl endRefreshing];
}

これでソートされたので、viewDidLoadの内部に以下を追加します:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:refreshControl];

これで、最上部のセルをリロードするカスタムリフレッシュテーブル機能ができました。テーブル全体をリロードするには、

[self.tableView reloadData];を新しい更新メソッドに追加します。

ビューを切り替えるたびにデータをリロードする場合は、メソッドを実装します。

//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];
}
16
App Dev Guy

スイフト3:

tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()
6
ergunkocak

IOS 6の新しいリテラル構文でこれらの回答をわずかに更新するために、単一オブジェクトにはPaths = @ [indexPath]を、複数オブジェクトにはPaths = @ [indexPath1、indexPath2、...]を使用できます。

個人的には、配列と辞書のリテラル構文が非常に便利で時間を大幅に節約できることがわかりました。一つには、読みやすいだけです。また、マルチオブジェクトリストの最後にnilを追加する必要がなくなりました。これは常に個人的なバガブーでした。私たちは皆、風車を傾けることができますか? ;-)

これをミックスに入れると思った。それが役に立てば幸い。

4
Gregory Hill

アップグレードセルが必要ですが、キーボードを閉じます。私が使用する場合

let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()

キーボードが消えます

0
user1784067