ฉันจะตั้งค่าคุณสมบัติเซลล์ของ UITableView ให้ไม่สามารถเลือกได้อย่างไร ฉันไม่ต้องการเห็นช่องการเลือกสีน้ำเงินนั้นเมื่อผู้ใช้แตะที่เซลล์
ฉันจะตั้งค่าคุณสมบัติเซลล์ของ UITableView ให้ไม่สามารถเลือกได้อย่างไร ฉันไม่ต้องการเห็นช่องการเลือกสีน้ำเงินนั้นเมื่อผู้ใช้แตะที่เซลล์
คำตอบ:
ตั้งค่ามือถือของตารางคุณสมบัติการselectionStyle
UITableViewCellSelectionStyleNone
ซึ่งควรป้องกันไม่ให้ไฮไลต์และคุณสามารถตรวจสอบคุณสมบัตินั้นในtableView:didSelectRowAtIndexPath:
ไฟล์.
เพื่อป้องกันไม่ให้เลือกUITableViewCell
มีคุณใช้UITableViewDelegate
tableView:willSelectRowAtIndexPath:
จากวิธีดังกล่าวคุณสามารถย้อนกลับได้nil
หากคุณไม่ต้องการให้เลือกแถว
- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
// Determine if row is selectable based on the NSIndexPath.
if (rowIsSelectable) {
return path;
}
return nil;
}
นี้จะช่วยป้องกันแถวจากการถูกเลือกและtableView:didSelectRowAtIndexPath:
จากการถูกเรียกว่า อย่างไรก็ตามโปรดทราบว่าสิ่งนี้ไม่ได้ป้องกันไม่ให้มีการไฮไลต์แถว
หากคุณต้องการป้องกันไม่ให้แถวนั้นถูกไฮไลต์ด้วยการสัมผัสคุณสามารถตรวจสอบให้แน่ใจว่าเซลล์selectionStyle
ถูกตั้งค่าเป็นUITableViewCellSelectionStyleNone
หรือควรให้คุณUITableViewDelegate
ใช้งานได้tableView:shouldHighlightRowAtIndexPath:
ดังนี้:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
didSelectRowAtIndexPath
เพราะมันwillSelectRowAtIndexPath
จะถูกเรียกอยู่เสมอ
ใช้สิ่งนี้:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
ยังคงเรียกว่า
สำหรับ iOS 6+ เท่านั้น
คุณสามารถใช้วิธีนี้
tableView:shouldHighlightRowAtIndexPath:
ในผู้รับมอบสิทธิ์ของคุณ อ่านเพิ่มเติมที่นี่: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html
หากมีปัญหานี้ก็ลองทุกอย่างที่กล่าวมาแล้ว เคล็ดลับสุดท้ายซึ่งกำจัด "แฟลชสีน้ำเงิน" ในการเลือกเซลล์ตารางคือการเพิ่มบรรทัดนี้:
self.myTableView.allowsSelection = NO;
ไม่แน่ใจว่ามันเป็นเส้นเดียวหรือทุกอย่างรวมกัน แต่ผลรวมที่ยอดเยี่ยมฉันไม่ได้เลือกสีน้ำเงินหรือแฟลชสีน้ำเงินอีกต่อไป มีความสุข!
ชุด cell.userInteractionEnabled = NO;
การใช้ IB ก็เป็นวิธีที่สวยงามเช่นกัน:
Apple บอกว่าสิ่งแรกที่คุณควรทำใน didSelectRowAtIndexPath คือการยกเลิกการเลือกแถว
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
จากนั้นคุณสามารถเปลี่ยน AccessoryType เป็นเครื่องหมายถูกหรือไม่มีเป็นต้นดังนั้นเมื่อคุณป้อน didSelectRowAtIndexPath คุณสามารถยกเลิกการเลือกแถวและหากไม่ได้ตั้งใจให้เลือกก็อย่าทำเครื่องหมายที่แถวนั้น
UITableViewCell
อีกวิธีหนึ่งคือการเพิ่มวิธีการในประเภทคู่ไป ฉันชอบคำตอบนี้ดีกว่าคำตอบของ Sebastians (ก็ดีเหมือนกัน) เพราะวิธีที่ฉันสร้างโต๊ะ ฉันคิดว่ามันอาจเป็นประโยชน์กับคนอื่น
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
Swift 4:
คุณสามารถป้องกันการเลือกและการไฮไลต์ได้โดยใช้ UITableViewDelegate: shouldHighlightRowAt
คำตอบนี้จะถือว่าคุณมีเซลล์ที่กำหนดเองที่สร้างขึ้นชื่อ: CustomTableViewCell
และคุณได้สร้างบูลีนภายในเซลล์ที่กำหนดเองที่ชื่อ: isSelectable
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
if cell.isSelectable == false {
return false
} else {
return true
}
}
นี่คือคำตอบ objc ของ Sebastian Celis เวอร์ชัน Swift
หากคุณได้ออกแบบเซลล์ของคุณในตัวสร้างอินเทอร์เฟซคุณสามารถทำได้โดยลบช่องทำเครื่องหมายออกจาก ' เปิดใช้งานการโต้ตอบกับผู้ใช้ ' สำหรับไฟล์tableViewCell
.
มีอีกวิธีง่ายๆในการหลีกเลี่ยงการเลือกที่ปรากฏเป็นสีน้ำเงิน
เลือกเซลล์ที่คุณไม่ต้องการให้ปรากฏเป็นสีน้ำเงิน
จากนั้นเลือกตัวตรวจสอบคุณสมบัติ (ไอคอนโล่ถัดจากไอคอนไม้บรรทัดในมุมมองคุณสมบัติด้านข้าง)
จากนั้นเปลี่ยนช่อง "การเลือก" จาก "สีน้ำเงิน" เป็น "ไม่มี"
โปรดทราบว่าสิ่งนี้ยังคงเลือกอยู่ แต่จะไม่ปรากฏตามที่เลือกหากคุณต้องการหลีกเลี่ยงเอฟเฟกต์ UI
ใช้ tableView: willDisplayCell: forRowAtIndexPath: แทน tableView: didSelectRowAtIndexPath: เพื่อกำจัดแฟลชที่ปรากฏในครั้งแรกที่คุณสัมผัสเซลล์
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
หากต้องการยกเลิกการเลือกแถวบางแถวคุณต้องทำการเปลี่ยนแปลงบางอย่างในสองวิธีของผู้ร่วมประชุม UITableView
ในวิธีการด้านล่าง
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
หลังจากจัดสรรเซลล์แล้วให้เขียนโค้ดด้านล่าง
if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;
รหัสด้านบนจะป้องกันไม่ให้ไฮไลต์เซลล์หากผู้ใช้พยายามเลือก
ในวิธีการมอบสิทธิ์ด้านล่างนี้
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if(indexPath.row == someCellNumber) return;
//for other cells write the code below...
}
หากคุณไม่เขียนif(indexPath.row == someCellNumber) return;
แถวจะยังคงถูกเลือกและมีโอกาสที่แอปจะหยุดทำงาน
Swift 4:
ในชั้นเซลล์:
selectionStyle = .none
สวิฟต์ 5
cell.isUserInteractionEnabled = false
tableView:shouldHighlightRowAtIndexPath:
เป็นไปตามที่ Ayush ระบุไว้ด้านล่าง