UITableView
sを使用するカスタムUITableViewCell
があります。各UITableViewCell
には2つのボタンがあります。これらのボタンをクリックすると、セル内のUIImageView
の画像が変更されます。
新しい画像を表示するために各セルを個別に更新することは可能ですか?どんな助けも大歓迎です。
セルの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];
もちろん、アニメーション効果として好きなものを設定できます。
-[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];
}
迅速:
func updateCell(path:Int){
let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
}
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)
{
....
}
カスタム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];
}
スイフト3:
tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()
IOS 6の新しいリテラル構文でこれらの回答をわずかに更新するために、単一オブジェクトにはPaths = @ [indexPath]を、複数オブジェクトにはPaths = @ [indexPath1、indexPath2、...]を使用できます。
個人的には、配列と辞書のリテラル構文が非常に便利で時間を大幅に節約できることがわかりました。一つには、読みやすいだけです。また、マルチオブジェクトリストの最後にnilを追加する必要がなくなりました。これは常に個人的なバガブーでした。私たちは皆、風車を傾けることができますか? ;-)
これをミックスに入れると思った。それが役に立てば幸い。
アップグレードセルが必要ですが、キーボードを閉じます。私が使用する場合
let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
キーボードが消えます