เมื่อคุณแตะแถวในUITableView
แถวนั้นจะมีการเน้นและเลือก เป็นไปได้หรือไม่ที่จะปิดการใช้งานนี้เพื่อให้การแตะแถวไม่ทำอะไรเลย?
เมื่อคุณแตะแถวในUITableView
แถวนั้นจะมีการเน้นและเลือก เป็นไปได้หรือไม่ที่จะปิดการใช้งานนี้เพื่อให้การแตะแถวไม่ทำอะไรเลย?
คำตอบ:
สำหรับฉันแล้วการทำงานต่อไปนี้ดี:
tableView.allowsSelection = false
ซึ่งหมายความว่าdidSelectRowAt#
จะไม่ทำงาน กล่าวคือการแตะแถวของตารางจะไม่ทำอะไรเลย (และแน่นอนว่าจะไม่มีภาพเคลื่อนไหวที่เลือก)
(โปรดทราบว่าหากในเซลล์คุณมีUIButton
หรือตัวควบคุมอื่น ๆ แน่นอนว่าตัวควบคุมเหล่านั้นจะยังคงใช้งานได้การควบคุมใด ๆ ที่คุณเกิดขึ้นกับเซลล์ตารางนั้นไม่เกี่ยวข้องกับความสามารถของ UITableView ทั้งหมดในการอนุญาตให้คุณ "เลือกแถว" ใช้งานdidSelectRowAt#
.)
อีกประเด็นที่ควรทราบคือ: สิ่งนี้ไม่ทำงานเมื่อUITableView
อยู่ในโหมดแก้ไข หากต้องการ จำกัด การเลือกเซลล์ในโหมดแก้ไขให้ใช้รหัสดังนี้:
tableView.allowsSelectionDuringEditing = false
selectionStyle
คุณสมบัติในเซลล์: cell.selectionStyle = UITableViewCellSelectionStyle.None
ใน Swift หรือcell.selectionStyle = UITableViewCellSelectionStyleNone
ใน Objective-C
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
ต้องการที่จะเรียกว่าcell.selectionStyle = .None
เป็นที่ต้องการ หากคุณไม่ต้องการหรือไม่สนใจฟังก์ชันของผู้รับมอบสิทธิ์ที่จะถูกเรียก (เช่นมีฟิลด์ข้อความในการตั้งค่า tableViewCell) tableView.allowsSelection = false
ก็ถือว่าใช้ได้
สิ่งที่คุณต้องทำคือตั้งค่าสไตล์การเลือกบนUITableViewCell
อินสแตนซ์โดยใช้:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
หรือ
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
สวิฟท์ 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 และ 4.x:
cell.selectionStyle = .none
เพิ่มเติมตรวจสอบให้แน่ใจว่าคุณไม่ได้ติดตั้ง-tableView:didSelectRowAtIndexPath:
ในผู้รับมอบสิทธิ์มุมมองตารางหรือแยกเซลล์ที่คุณต้องการไม่มีการดำเนินการอย่างชัดเจนถ้าคุณใช้งาน
เนื่องจากเมื่อเร็ว ๆ นี้ฉันได้อ่านโพสต์นี้และได้ช่วยฉันฉันต้องการโพสต์คำตอบอื่นเพื่อรวมคำตอบทั้งหมด (สำหรับลูกหลาน)
ดังนั้นจึงมี 5 คำตอบที่แตกต่างกันขึ้นอยู่กับตรรกะและ / หรือผลลัพธ์ที่คุณต้องการ:
1. หากต้องการปิดใช้งานการไฮไลต์สีน้ำเงินโดยไม่เปลี่ยนการโต้ตอบอื่นของเซลล์:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
ฉันใช้สิ่งนี้เมื่อฉันมี UIButton - หรือตัวควบคุมอื่น ๆ - โฮสต์อยู่ใน UITableViewCell และฉันต้องการให้ผู้ใช้สามารถโต้ตอบกับส่วนควบคุมได้ แต่ไม่ใช่เซลล์เอง
หมายเหตุ : tableView:didSelectRowAtIndexPath:
ขณะที่โทนี่ล้านระบุไว้ข้างต้นนี้ไม่ได้ป้องกัน ฉันได้รับรอบนี้โดยง่าย "ถ้า" คำสั่งส่วนใหญ่มักจะทดสอบสำหรับส่วนและหลีกเลี่ยงการกระทำสำหรับส่วนเฉพาะ
อีกวิธีที่ฉันคิดว่าจะทดสอบการแตะเซลล์เช่นนี้คือ:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2. ในการทำเช่นนี้สำหรับทั้งตารางคุณสามารถใช้วิธีแก้ปัญหาข้างต้นกับแต่ละเซลล์ในตาราง แต่คุณสามารถทำได้เช่นกัน:
[tableView setAllowsSelection:NO];
ในการทดสอบของฉันนี้ยังช่วยให้การควบคุมภายในUITableViewCell
เป็นแบบโต้ตอบ
3. ในการสร้างเซลล์ "อ่านอย่างเดียว" คุณสามารถทำสิ่งนี้ได้:
[cell setUserInteractionEnabled:NO];
4. เพื่อให้ทั้งตารางเป็น "อ่านอย่างเดียว"
[tableView setUserInteractionEnabled:NO];
5. ในการพิจารณาว่าจะไฮไลต์เซลล์หรือไม่ (ตามคำตอบนี้รวมถึงการเลือกโดยปริยาย) คุณสามารถใช้UITableViewDelegate
วิธีโปรโตคอลต่อไปนี้:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
tableView:shouldHighlightRowAtIndexPath:
ซึ่งโดยทั่วไป (ไม่เสมอไป) แนวทางที่ฉันต้องการ
เพื่อสรุปสิ่งที่ฉันเชื่อว่าเป็นคำตอบที่ถูกต้องตามประสบการณ์ของฉันในการดำเนินการนี้:
หากคุณต้องการปิดการใช้งานการเลือกเพียงบางส่วนของเซลล์ให้ใช้:
cell.userInteractionEnabled = NO;
เช่นเดียวกับการป้องกันการเลือกสิ่งนี้จะหยุด tableView: didSelectRowAtIndexPath: ถูกเรียกสำหรับเซลล์ที่ตั้งค่าไว้ (เครดิตไปถึง Tony ล้านสำหรับคำตอบนี้ขอบคุณ!)
หากคุณมีปุ่มในเซลล์ของคุณที่ต้องคลิกคุณจะต้อง:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
และคุณต้องละเว้นการคลิกใด ๆ ในเซลล์- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
ด้วย
หากคุณต้องการปิดการใช้งานการเลือกสำหรับทั้งตารางใช้:
tableView.allowsSelection = NO;
(ขอเครดิตให้ Paulo De Barros ขอบคุณ!)
ตั้งแต่ iOS 6.0 UITableViewDelegate
tableView:shouldHighlightRowAtIndexPath:
มี (อ่านเกี่ยวกับเรื่องนี้ในเอกสารประกอบ iOS )
วิธีนี้ช่วยให้คุณทำเครื่องหมายแถวที่เฉพาะเจาะจงว่าไม่ได้เป็นไฮไลท์ (และโดยปริยายไม่สามารถเลือกได้) โดยไม่ต้องเปลี่ยนรูปแบบการเลือกของเซลล์ยุ่งกับการจัดการกับเซลล์ของเหตุการณ์userInteractionEnabled = NO
หรือเทคนิคอื่น ๆ ที่จัดทำไว้ที่นี่
นอกจากนี้คุณยังสามารถปิดการใช้งานการเลือกแถวจากเครื่องมือสร้างอินเตอร์เฟสได้โดยเลือกNoSelection
จากselection
ตัวเลือก (ของคุณสมบัติ UITableView) ในบานหน้าต่างตัวตรวจสอบตามที่แสดงในภาพด้านล่าง
โซลูชันที่ได้รับการแก้ไขสำหรับ SWIFT 3
cell.selectionStyle = .none
หากคุณต้องการให้ตัวเลือกเฉพาะแฟลชไม่อยู่ในสถานะที่เลือกคุณสามารถโทรเข้า
didSelectRowAtIndexPath
ต่อไปนี้
[tableView deselectRowAtIndexPath:indexPath animated:YES];
ดังนั้นมันจะกะพริบสถานะที่เลือกและเปลี่ยนกลับ
นี่คือสิ่งที่ฉันใช้ในการcellForRowAtIndexPath
เขียนรหัสนี้:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
จากUITableViewDelegate
พิธีสารคุณสามารถใช้วิธีการwillSelectRowAtIndexPath
และreturn nil
ถ้าคุณไม่ต้องการเลือกแถว
ในทำนองเดียวกันคุณสามารถใช้willDeselectRowAtIndexPath
วิธีการและreturn nil
หากคุณไม่ต้องการให้แถวยกเลิกการเลือก
1- สิ่งที่คุณต้องทำคือตั้งค่าสไตล์การเลือกในUITableViewCell
อินสแตนซ์โดยใช้:
Objective-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
หรือ
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
สวิฟท์ 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
สวิฟท์ 3:
cell.selectionStyle = .none
2 - อย่านำไปใช้ - tableView:didSelectRowAtIndexPath:
ในมุมมองตารางของคุณdelegate
หรือยกเว้นเซลล์ที่คุณต้องการให้ไม่มีการดำเนินการหากคุณใช้งาน
3 - นอกจากนี้คุณยังสามารถทำได้จากกระดานเรื่องราว คลิกเซลล์มุมมองตารางและในตัวตรวจสอบแอตทริบิวต์ใต้เซลล์มุมมองตารางเปลี่ยนรายการแบบหล่นลงถัดจากส่วนที่เลือกเป็นไม่มี
4 - คุณสามารถปิดใช้งานการเน้นเซลล์ตารางโดยใช้รหัสด้านล่างใน (iOS) Xcode 9, Swift 4.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
ด้านล่าง snippet ปิดการใช้งานเน้น didSelectRowAtIndexPath
แต่ก็ยังปิดการใช้งานการเรียกร้องให้ ดังนั้นหากคุณไม่ได้ใช้งานให้didSelectRowAtIndexPath
ใช้วิธีการด้านล่าง ควรเพิ่มสิ่งนี้เมื่อคุณสร้างตาราง สิ่งนี้จะทำงานกับปุ่มและUITextField
ภายในเซลล์
self.tableView.allowsSelection = NO;
ด้านล่าง snippet didSelectRowAtIndexPath
ปิดการใช้งานไฮไลต์และก็ไม่ได้ปิดการใช้งานการเรียกร้องให้ ตั้งค่ารูปแบบการเลือกของเซลล์เป็นไม่มีในcellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ตัวอย่างด้านล่างปิดใช้งานทุกอย่างในเซลล์ ซึ่งจะเป็นการปิดการปฏิสัมพันธ์กับbuttons
, textfields
:
self.tableView.userInteractionEnabled = false;
ด้านล่างนี้Swift
เทียบเท่าObjective-C
โซลูชันข้างต้น:
การเปลี่ยนโซลูชันแรก
self.tableView.allowsSelection = false
การทดแทนโซลูชันที่สอง
cell?.selectionStyle = UITableViewCellSelectionStyle.None
การเปลี่ยนโซลูชันที่สาม
self.tableView.userInteractionEnabled = false
ลองพิมพ์:
cell.selected = NO;
มันจะยกเลิกการเลือกแถวของคุณเมื่อจำเป็น
ใน Swift3 ...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
ฉันได้ต่อสู้กับสิ่งนี้อย่างล้นเหลือด้วยการควบคุมUITableViewCell
ห้ามใช้userInteractionEnabled
ทรัพย์สินของฉัน ฉันมีตารางคงที่ 3 เซลล์สำหรับการตั้งค่า 2 กับวันที่ 1 พร้อมสวิตช์เปิด / ปิด หลังจากเล่นเกี่ยวกับใน Storyboard / IB ฉันได้พยายามทำให้เลือกไม่ได้ แต่เมื่อคุณแตะมันการเลือกจากแถวบนสุดแถวใดแถวหนึ่งจะหายไป นี่คือภาพ WIP ของการตั้งค่าของฉัน UITableView:
หากคุณแตะแถวที่ 3 ไม่มีอะไรเกิดขึ้นการเลือกจะยังคงอยู่ในแถวที่สอง ฟังก์ชั่นนี้เป็นสำเนาของหน้าจอการเลือกเวลาเพิ่มแอปของปฏิทินแอปเปิ้ล
รหัสนี้เข้ากันได้อย่างน่าประหลาดใจจนถึง IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
สิ่งนี้ทำงานร่วมกับการตั้งค่ารูปแบบการเลือกเป็น none ดังนั้นเซลล์จึงไม่สั่นเมื่อสัมผัสเหตุการณ์
เราสามารถเขียนโค้ดเช่น
cell.selectionStyle = UITableViewCellSelectionStyleNone;
แต่เมื่อเรามีเซลล์ xib ที่กำหนดเองด้านบนบรรทัดให้เตือนในเวลานั้น
กำหนดเซลล์ xib
เราจำเป็นต้องตั้งค่าสไตล์การเลือกไม่มีจากเครื่องมือสร้างอินเตอร์เฟส
คุณเพียงแค่ใส่รหัสนี้ลงใน cellForRowAtIndexPath
วิธีปิดใช้งานคุณสมบัติการเลือกของเซลล์: (ขณะที่แตะเซลล์)
cell.selectionStyle = UITableViewCellSelectionStyle.None
ลองนี้
cell.selectionStyle = UITableViewCellSelectionStyleNone;
และ
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
และคุณยังสามารถตั้งค่ารูปแบบการเลือกโดยใช้ interfacebuilder
ฉันใช้สิ่งนี้ซึ่งเหมาะกับฉัน
cell?.selectionStyle = UITableViewCellSelectionStyle.None
ขณะนี้เป็นทางออกที่ดีที่สุดและง่ายที่สุดในการป้องกันไม่ให้แถวแสดงไฮไลต์ระหว่างการเลือก
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ฉันขอแนะนำด้วยว่าบางครั้งมันมีประโยชน์ในการแสดงสั้น ๆ ว่าแถวถูกเลือกแล้วปิด นี่เป็นการเตือนผู้ใช้พร้อมยืนยันสิ่งที่พวกเขาตั้งใจจะเลือก:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
เพื่อปิดใช้งานการไฮไลต์ของ UItableviewcell
cell.selectionStyle = UITableViewCellSelectionStyleNone;
และไม่ควรอนุญาตให้ผู้ใช้โต้ตอบกับเซลล์
cell.userInteractionEnabled = NO;
คุณสามารถตั้งค่าสีพื้นหลังเป็น Clear เพื่อให้ได้เอฟเฟกต์เดียวกันกับUITableViewCellSelectionStyleNone
ในกรณีที่คุณไม่ต้องการ / ไม่สามารถใช้UITableViewCellSelectionStyleNone
ไม่สามารถใช้
คุณจะใช้รหัสดังนี้:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
สิ่งนี้อาจลดประสิทธิภาพของคุณเมื่อเพิ่มมุมมองสีพิเศษให้กับแต่ละเซลล์
คุณสามารถใช้ได้ :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
ในเซลล์สำหรับแถวที่วิธีดัชนีพา ธ ของ UITableView ของคุณ
นอกจากนี้คุณสามารถใช้:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
ในวิธีดู didselectrowatindexpath
cell.selectionStyle = UITableViewCellSelectionStyle.none
อยู่ใน Swift 3
คุณสามารถใช้สิ่งนี้
cell.selectionStyle = UITableViewCellSelectionStyleNone;
คุณสามารถใช้ได้ ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
การเข้ารหัสมีความสุข !!!
คุณสามารถทำได้จากกระดานเรื่องราว คลิกเซลล์มุมมองตารางและในตัวตรวจสอบแอตทริบิวต์ใต้เซลล์มุมมองตารางเปลี่ยนรายการแบบหล่นลงถัดจากส่วนที่เลือกเป็นไม่มี
selection
และแน่นอนว่าhighlighting
จะถูกปิดการใช้งานด้วย สูงหลายคนได้รับการโหวตคำตอบอธิบายวิธีการและไม่ได้ปิดการใช้งานอยู่disable selection
highlighting
หากต้องการปิดใช้งานเฉพาะการเน้นการใช้งานcell.selectionStyle = .None
หรือไปที่storyboard / cell / Selection = None