ฉันมีแบบกำหนดเองUITableView
โดยใช้UITableViewCell
s แต่ละUITableViewCell
ปุ่มมี 2 ปุ่ม การคลิกปุ่มเหล่านี้จะเป็นการเปลี่ยนภาพUIImageView
ภายในเซลล์
เป็นไปได้ไหมที่จะรีเฟรชแต่ละเซลล์แยกกันเพื่อแสดงภาพใหม่? ความช่วยเหลือใด ๆ ที่ชื่นชม
ฉันมีแบบกำหนดเองUITableView
โดยใช้UITableViewCell
s แต่ละ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];
คุณสามารถกำหนดสิ่งที่คุณชอบเป็นเอฟเฟกต์ภาพเคลื่อนไหวได้แน่นอน
beginUpdates
และendUpdates
ไม่จำเป็น
ฉันพยายามโทร-[UITableView cellForRowAtIndexPath:]
แต่ก็ไม่ได้ผล แต่ตัวอย่างต่อไปนี้เหมาะสำหรับฉัน ฉัน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];
}
แทรกวิธีการรีเฟรชต่อไปนี้ซึ่งโทรไปยังวิธีการด้านบนเพื่อให้คุณสามารถโหลดซ้ำได้เฉพาะเซลล์ด้านบน (หรือมุมมองตารางทั้งหมดหากคุณต้องการ):
- (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, ... ] สำหรับหลาย ๆ วัตถุ
โดยส่วนตัวแล้วฉันได้พบไวยากรณ์ที่แท้จริงของอาร์เรย์และพจนานุกรมที่มีประโยชน์อย่างมากและเป็นผู้ประหยัดครั้งใหญ่ มันง่ายกว่าที่จะอ่านสำหรับสิ่งหนึ่ง และมันไม่จำเป็นต้องมีศูนย์ในตอนท้ายของรายการหลายวัตถุใด ๆ ซึ่งเป็นแมลงปีกแข็งส่วนตัวอยู่เสมอ เราทุกคนมีกังหันลมเพื่อเอียงด้วยใช่ไหม ;-)
แค่คิดว่าฉันจะโยนมันลงไปในส่วนผสม หวังว่ามันจะช่วย
นี่คือส่วนขยาย UITableView ด้วย Swift 5:
import UIKit
extension UITableView
{
func updateRow(row: Int, section: Int = 0)
{
let indexPath = IndexPath(row: row, section: section)
self.beginUpdates()
self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
self.endUpdates()
}
}
โทรไปด้วย
self.tableView.updateRow(row: 1)
ฉันต้องการเซลล์อัพเกรด แต่ฉันต้องการปิดแป้นพิมพ์ ถ้าฉันใช้
let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
คีย์บอร์ดหายไป
[NSArray arrayWithObject:]
แทน