เลือกแถว tableview โดยทางโปรแกรม


136

ฉันจะเลือกUITableViewแถวโดยทางโปรแกรมได้อย่างไร

- (void)tableView:(UITableView *)tableView 
        didSelectRowAtIndexPath:(NSIndexPath *)indexPath

โดนประหาร? selectRowAtIndexPathจะเน้นเฉพาะแถว


ฉันพบปัญหาเดียวกันและเพียงแค่ปรับลิงก์: stackoverflow.com/questions/5324501/…ฉันหวังว่ามันจะเป็นประโยชน์สำหรับคุณ
michael

คำตอบ:


110

จากเอกสารอ้างอิง:

การเรียกใช้วิธีนี้ไม่ทำให้ผู้รับมอบสิทธิ์ได้รับtableView:willSelectRowAtIndexPath:หรือtableView:didSelectRowAtIndexPath:ข้อความและไม่ส่งการUITableViewSelectionDidChangeNotificationแจ้งเตือนไปยังผู้สังเกตการณ์

สิ่งที่ฉันจะทำคือ:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self doSomethingWithRowAtIndexPath:indexPath];
}

จากที่คุณต้องการเรียกใช้ selectRowAtIndexPath ให้คุณเรียก doSomethingWithRowAtIndexPath แทน นอกจากนี้คุณยังสามารถเรียกใช้ selectRowAtIndexPath ได้อีกด้วยหากคุณต้องการให้ข้อเสนอแนะ UI เกิดขึ้น


4
หรือเมื่อคุณเลือกแถวโดยทางโปรแกรมคุณสามารถเรียก tableView: didSelectRowAtIndexPath: yourself (ในคลาสที่คุณต่อสายเป็นผู้รับมอบสิทธิ์)
Kendall Helmstetter Gelner

3
วิธีนี้ดูเหมือนแฮ็คสำหรับฉันมันทำให้งานเสร็จ แต่ฉันคิดว่าควรมีวิธีที่ดีกว่านี้
Tapan Thaker

1
ฉันไม่คิดว่าคุณต้องสร้างการเรียก "doSomethingWithRowAtIndexPath" คุณไม่สามารถเรียกเมธอด delegate และส่งผ่านอาร์กิวเมนต์ที่คุณต้องการเพื่อดำเนินการตรรกะ didSelect จากตำแหน่งที่คุณใช้เมธอดมอบหมายได้หรือไม่?
ImpactZero

112

เหมือนที่ 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)

63

SelectRowAtIndexPathของ UITableView : animated: scrollPosition:ควรทำเคล็ดลับ

เพียงแค่ผ่านUITableViewScrollPositionNonescrollPosition และผู้ใช้จะไม่เห็นการเคลื่อนไหวใด ๆ


คุณควรจะรันการดำเนินการได้ด้วยตนเอง:

[theTableView.delegate tableView:theTableView didSelectRowAtIndexPath:indexPath]

หลังจากที่คุณselectRowAtIndexPath:animated:scrollPosition:ไฮไลต์จึงเกิดขึ้นรวมทั้งตรรกะที่เกี่ยวข้อง


ขออภัยนั่นคือสิ่งที่ฉันใช้ ฉันเผลอใส่ scrollToRowAtIndexPath ฉันได้อัปเดตคำถามแล้ว scrollToRowAtIndexPath ไฮไลต์เซลล์เท่านั้น
4thSpace

2
ใช่ฉันขอโทษ มันบอกว่ามันจะไม่ยิง didSelectRowAtIndexPath ที่นั่นในลิงค์เอกสารที่ฉันโพสต์ ฉันจำเป็นต้องเรียนรู้ที่จะอ่าน
anq

@anq: ขอบคุณมาก! ช่วยฉันได้เมื่อฉันเรียก didSelectRowAtIndexPath: indexPath ในเซลล์ที่กำหนดเอง
Bentley

21

หากคุณต้องการเลือกแถวนี้จะช่วยคุณได้

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[someTableView selectRowAtIndexPath:indexPath 
                           animated:NO 
                     scrollPosition:UITableViewScrollPositionNone];

นอกจากนี้ยังจะเน้นแถว แล้วมอบหมาย

 [someTableView.delegate someTableView didSelectRowAtIndexPath:indexPath];

18

โซลูชัน 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)

สำหรับฉันการเพิ่ม ".delegate?" เป็นกุญแจสำคัญ (Swift 4.5)
KoreanXcodeWorker

4

มีสองวิธีที่แตกต่างกันสำหรับแพลตฟอร์ม 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];
    

3

ใช้หมวดหมู่นี้เพื่อเลือกแถวของตารางและดำเนินการต่อตามที่กำหนดหลังจากล่าช้า
เรียกสิ่งนี้ภายใน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

2
คำถามไม่เกี่ยวข้องกับเซ็กส์
delete_user

ใช่ไม่มีอะไรในคำตอบของคุณที่เกี่ยวข้องกับคำถาม
dulgan

2
ชื่นชมคำตอบนี้ สิ่งนี้จะทำงานได้อย่างสมบูรณ์หากผู้ใช้ต้องการให้เกิดพฤติกรรมเดียวกัน แต่ใช้สตอรี่บอร์ด
Bijoy Thangaraj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.