UITableView การตั้งค่าบางเซลล์เป็น "ไม่สามารถเลือกได้"


109

ฉันจะตั้งค่าคุณสมบัติเซลล์ของ UITableView ให้ไม่สามารถเลือกได้อย่างไร ฉันไม่ต้องการเห็นช่องการเลือกสีน้ำเงินนั้นเมื่อผู้ใช้แตะที่เซลล์


4
หมายเหตุ googler ล่าสุด: วิธีการทำเช่นนี้ใน iOS 6 ขึ้นไปtableView:shouldHighlightRowAtIndexPath:เป็นไปตามที่ Ayush ระบุไว้ด้านล่าง
jemmons

คำตอบ:


151

ตั้งค่ามือถือของตารางคุณสมบัติการselectionStyle UITableViewCellSelectionStyleNoneซึ่งควรป้องกันไม่ให้ไฮไลต์และคุณสามารถตรวจสอบคุณสมบัตินั้นในtableView:didSelectRowAtIndexPath:ไฟล์.


3
เคนดอลพูดถูก ทำตามคำตอบของ Sebastian Celis เพื่อป้องกันไม่ให้ didSelectRowAtIndexPath ถูกเรียกตั้งแต่แรก คุณควรตั้งค่า selectionStyle ด้วยเพื่อป้องกันการไฮไลต์
Daniel Dickison

ใช่ฉันคิดว่าคำตอบของ Sebastian Celis เป็นคำตอบที่ถูกต้องขอบคุณ Daniel
LolaRun

1
แฟนสตอรี่บอร์ดที่ใช้ TableViews แบบคงที่สามารถเลือก UITableViewCell และภายใต้ตัวตรวจสอบคุณสมบัติสามารถค้นหาฟิลด์การเลือกและตั้งค่าเป็นไม่มี
Manuel BM

198

เพื่อป้องกันการเลือกแถว

เพื่อป้องกันไม่ให้เลือก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;
}

1
ขอบคุณ! สิ่งที่ฉันต้องการ
Buchannon

11
นี่ควรเป็นคำตอบที่ยอมรับได้ในความคิดของฉัน มันช่วยแก้ปัญหาได้จริงแทนที่จะปกปิดมัน
Tovi7

4
โปรดสังเกตว่า tableView: willSelectRowAtIndexPath: ถูกเรียกหลังจากไฮไลต์เซลล์ซึ่งจะทำให้เกิดการสั่นไหว จากคำอธิบายของ Apple: วิธีนี้จะไม่ถูกเรียกจนกว่าผู้ใช้จะแตะแถวแล้วยกนิ้วขึ้น แถวนั้นจะไม่ถูกเลือกจนกว่าจะถึงเวลานั้นแม้ว่าจะมีการไฮไลต์เมื่อแตะลง
Daniel

5
ฉันเห็นด้วยกับ @simpleBob ในการใช้โซลูชันนี้คุณต้องตั้งค่า cell.selectionStyle เป็น UITableViewCellSelectionStyleNone บนแถวที่เลือกไม่ได้ ไม่งั้นจะดูไม่มีรสนิยม
Kyle Clegg

แล้วคำตอบที่ดีที่สุดก็ยังคงเป็นคำตอบที่ได้รับการยอมรับ คุณสามารถเลือกที่จะไม่ทำอะไรเลยdidSelectRowAtIndexPathเพราะมันwillSelectRowAtIndexPathจะถูกเรียกอยู่เสมอ
MLQ

16

ใช้สิ่งนี้:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
นั่นเป็นเพียงการหยุดสีที่เลือกไม่ให้แสดงเท่านั้นdidSelectRowAtIndexPathยังคงเรียกว่า
zekel

นี่เป็นคำตอบเดียวกับคำถามนี้ของ Daniel Dickison

Swift 2.2 UPDATE - cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com

11

สำหรับ iOS 6+ เท่านั้น

คุณสามารถใช้วิธีนี้ tableView:shouldHighlightRowAtIndexPath:ในผู้รับมอบสิทธิ์ของคุณ อ่านเพิ่มเติมที่นี่: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
ควรมีคะแนนโหวตมากกว่านี้ นี่คือคำตอบที่ถูกต้องการเปลี่ยนรูปแบบการเลือกดังนั้นคุณจึงไม่เห็นเซลล์ที่ถูกเลือกปิดการใช้งานการโต้ตอบของผู้ใช้ดังนั้นคุณจึงไม่สามารถแตะที่เซลล์หรือการยกเลิกการเลือกเซลล์ในการเลือกเป็นการแฮ็ก
Stuart Campbell

9

หากมีปัญหานี้ก็ลองทุกอย่างที่กล่าวมาแล้ว เคล็ดลับสุดท้ายซึ่งกำจัด "แฟลชสีน้ำเงิน" ในการเลือกเซลล์ตารางคือการเพิ่มบรรทัดนี้:

self.myTableView.allowsSelection = NO;

ไม่แน่ใจว่ามันเป็นเส้นเดียวหรือทุกอย่างรวมกัน แต่ผลรวมที่ยอดเยี่ยมฉันไม่ได้เลือกสีน้ำเงินหรือแฟลชสีน้ำเงินอีกต่อไป มีความสุข!


1
ปัญหาคือทำให้เซลล์ทั้งหมดใน tableview ไม่สามารถเลือกได้ หากคุณต้องการให้เซลล์บางเซลล์สามารถเลือกได้และเซลล์อื่น ๆ ไม่สามารถเลือกได้จะไม่ทำเช่นนั้น วิธีการของเซบาสเตียนใช้ได้ผลกับฉัน
Terry

True, allowSelection = NO จะปิดการใช้งานการเลือกสำหรับเซลล์ทั้งหมด
JOM

1
มีคุณสมบัติเทียบเท่าใน Interface Builder สำหรับคุณสมบัตินี้หรือไม่
chrish

8

ชุด cell.userInteractionEnabled = NO;


เดี๋ยวก็ทำแบบนั้น เรียงลำดับจาก. สร้างตัวพิมพ์เล็ก 'FALSE' และสูญเสียอัฒภาคบ้านั้น ที่จะรวดเร็วสำหรับคุณ 'FALSE' เป็นสิ่งที่ชั่วร้ายและไม่ถูกต้องตอนนี้ 'ไม่' คือความชั่วร้ายและผิด จนกว่าจะถึงสัปดาห์หน้าเมื่อ 'เท็จ' เป็นสิ่งที่ชั่วร้ายและไม่ถูกต้องทำแบบนั้น
HalR


3

Apple บอกว่าสิ่งแรกที่คุณควรทำใน didSelectRowAtIndexPath คือการยกเลิกการเลือกแถว

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

จากนั้นคุณสามารถเปลี่ยน AccessoryType เป็นเครื่องหมายถูกหรือไม่มีเป็นต้นดังนั้นเมื่อคุณป้อน didSelectRowAtIndexPath คุณสามารถยกเลิกการเลือกแถวและหากไม่ได้ตั้งใจให้เลือกก็อย่าทำเครื่องหมายที่แถวนั้น

คู่มือการเขียนโปรแกรม Table View


1
ในกรณีนั้นเมื่อผู้ใช้สัมผัสเซลล์เซลล์นั้นจะถูกไฮไลต์เป็นเวลาสั้น ๆ จากนั้นจะไม่ไฮไลต์ - แต่อย่างที่ฉันเข้าใจประเด็นก็คือการหยุดไม่ให้ไฮไลต์โดยสิ้นเชิง
Kuba Suder

3

UITableViewCellอีกวิธีหนึ่งคือการเพิ่มวิธีการในประเภทคู่ไป ฉันชอบคำตอบนี้ดีกว่าคำตอบของ Sebastians (ก็ดีเหมือนกัน) เพราะวิธีที่ฉันสร้างโต๊ะ ฉันคิดว่ามันอาจเป็นประโยชน์กับคนอื่น

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}

3

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


1

หากคุณได้ออกแบบเซลล์ของคุณในตัวสร้างอินเทอร์เฟซคุณสามารถทำได้โดยลบช่องทำเครื่องหมายออกจาก ' เปิดใช้งานการโต้ตอบกับผู้ใช้ ' สำหรับไฟล์tableViewCell.


0

มีอีกวิธีง่ายๆในการหลีกเลี่ยงการเลือกที่ปรากฏเป็นสีน้ำเงิน

เลือกเซลล์ที่คุณไม่ต้องการให้ปรากฏเป็นสีน้ำเงิน

จากนั้นเลือกตัวตรวจสอบคุณสมบัติ (ไอคอนโล่ถัดจากไอคอนไม้บรรทัดในมุมมองคุณสมบัติด้านข้าง)

จากนั้นเปลี่ยนช่อง "การเลือก" จาก "สีน้ำเงิน" เป็น "ไม่มี"

โปรดทราบว่าสิ่งนี้ยังคงเลือกอยู่ แต่จะไม่ปรากฏตามที่เลือกหากคุณต้องการหลีกเลี่ยงเอฟเฟกต์ UI


0

ใช้ tableView: willDisplayCell: forRowAtIndexPath: แทน tableView: didSelectRowAtIndexPath: เพื่อกำจัดแฟลชที่ปรากฏในครั้งแรกที่คุณสัมผัสเซลล์

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

0

หากต้องการยกเลิกการเลือกแถวบางแถวคุณต้องทำการเปลี่ยนแปลงบางอย่างในสองวิธีของผู้ร่วมประชุม 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;แถวจะยังคงถูกเลือกและมีโอกาสที่แอปจะหยุดทำงาน



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