ฉันจะเลือกUITableView
แถวโดยทางโปรแกรมได้อย่างไร
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
โดนประหาร? selectRowAtIndexPath
จะเน้นเฉพาะแถว
ฉันจะเลือกUITableView
แถวโดยทางโปรแกรมได้อย่างไร
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
โดนประหาร? selectRowAtIndexPath
จะเน้นเฉพาะแถว
คำตอบ:
การเรียกใช้วิธีนี้ไม่ทำให้ผู้รับมอบสิทธิ์ได้รับ
tableView:willSelectRowAtIndexPath:
หรือtableView:didSelectRowAtIndexPath:
ข้อความและไม่ส่งการUITableViewSelectionDidChangeNotification
แจ้งเตือนไปยังผู้สังเกตการณ์
สิ่งที่ฉันจะทำคือ:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self doSomethingWithRowAtIndexPath:indexPath];
}
จากที่คุณต้องการเรียกใช้ selectRowAtIndexPath ให้คุณเรียก doSomethingWithRowAtIndexPath แทน นอกจากนี้คุณยังสามารถเรียกใช้ selectRowAtIndexPath ได้อีกด้วยหากคุณต้องการให้ข้อเสนอแนะ UI เกิดขึ้น
เหมือนที่ Jaanus บอก:
การเรียกวิธีนี้ (-selectRowAtIndexPath: animated: scrollPosition :) ไม่ทำให้ผู้รับมอบสิทธิ์ได้รับ tableView: willSelectRowAtIndexPath: หรือ tableView: didSelectRowAtIndexPath: message และจะไม่ส่งการแจ้งเตือน UITableViewSelectionDidChangeNotification ไปยังผู้สังเกตการณ์
ดังนั้นคุณต้องเรียกdelegate
เมธอดด้วยตัวเอง
ตัวอย่างเช่น:
เวอร์ชัน Swift 3:
let indexPath = IndexPath(row: 0, section: 0);
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
self.tableView(self.tableView, didSelectRowAt: indexPath)
ObjectiveC เวอร์ชัน:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath
animated:YES
scrollPosition:UITableViewScrollPositionNone];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
เวอร์ชัน Swift 2.3:
let indexPath = NSIndexPath(forRow: 0, inSection: 0);
self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
self.tableView(self.tableView, didSelectRowAtIndexPath: indexPath)
SelectRowAtIndexPathของ UITableView : animated: scrollPosition:ควรทำเคล็ดลับ
เพียงแค่ผ่านUITableViewScrollPositionNone
scrollPosition และผู้ใช้จะไม่เห็นการเคลื่อนไหวใด ๆ
คุณควรจะรันการดำเนินการได้ด้วยตนเอง:
[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]
หลังจากที่คุณselectRowAtIndexPath:animated:scrollPosition:
ไฮไลต์จึงเกิดขึ้นรวมทั้งตรรกะที่เกี่ยวข้อง
หากคุณต้องการเลือกแถวนี้จะช่วยคุณได้
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath
animated:NO
scrollPosition:UITableViewScrollPositionNone];
นอกจากนี้ยังจะเน้นแถว แล้วมอบหมาย
[someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];
โซลูชัน Swift 3/4/5
เลือกแถว
let indexPath = IndexPath(row: 0, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)
ยกเลิกการเลือกแถว
let deselectIndexPath = IndexPath(row: 7, section: 0)
tblView.deselectRow(at: deselectIndexPath, animated: true)
tblView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)
มีสองวิธีที่แตกต่างกันสำหรับแพลตฟอร์ม iPad และ iPhone ดังนั้นคุณต้องใช้ทั้งสองอย่าง:
ต่อ
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
// Selection handler (for horizontal iPad)
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
// Segue (for iPhone and vertical iPad)
[self performSegueWithIdentifier:"showDetail" sender:self];
ใช้หมวดหมู่นี้เพื่อเลือกแถวของตารางและดำเนินการต่อตามที่กำหนดหลังจากล่าช้า
เรียกสิ่งนี้ภายในviewDidAppear
วิธีการของคุณ:
[tableViewController delayedSelection:withSegueIdentifier:]
@implementation UITableViewController (TLUtils)
-(void)delayedSelection:(NSIndexPath *)idxPath withSegueIdentifier:(NSString *)segueID {
if (!idxPath) idxPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self performSelector:@selector(selectIndexPath:) withObject:@{@"NSIndexPath": idxPath, @"UIStoryboardSegue": segueID } afterDelay:0];
}
-(void)selectIndexPath:(NSDictionary *)args {
NSIndexPath *idxPath = args[@"NSIndexPath"];
[self.tableView selectRowAtIndexPath:idxPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
if ([self.tableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)])
[self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:idxPath];
[self performSegueWithIdentifier:args[@"UIStoryboardSegue"] sender:self];
}
@end