ios - 我如何禁用UITableView選擇突出顯示?




objective-c cocoa-touch highlight (25)

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

當您在UITableView點擊一行時,該行將突出顯示並被選中。 是否有可能禁用此功能,因此點擊一行無能為力?


快速取消選擇

cell.selectionStyle = .None

嘗試這個

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

你也可以使用interfacebuilder設置選擇風格。


UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

快樂編碼!


UITableViewDelegate協議可以使用方法willSelectRowAtIndexPathreturn nil如果你不想選擇該行。

以相同的方式,您可以使用willDeselectRowAtIndexPath方法,如果不希望該行取消選擇,則return nil


雖然這是防止行在選擇過程中顯示突出顯示的最佳和最簡單的解決方案

cell.selectionStyle = UITableViewCellSelectionStyleNone;

我還想建議偶爾有用的是簡要說明該行已被選中然後關閉。 這提醒用戶確認他們想要選擇什麼:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}

如果有人需要Swift答案:

cell.selectionStyle = .None

您所要做的就是使用以下任一方法在UITableViewCell實例上設置選擇樣式:

Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3:

cell.selectionStyle = .none

此外,請確保您在表視圖委託中不實施-tableView:didSelectRowAtIndexPath:或者如果您實施了它,請明確排除您希望沒有操作的單元。

更多信息在這里here


我一直在與這個非常大量的鬥爭,在我的UITableViewCell有一個控件禁止使用userInteractionEnabled屬性。 我有一個3格的靜態表格供設置使用,2個使用日期,1個使用開關。 在Storyboard / IB中玩過後,我設法讓底部的一個不可選,但是當你點擊它時,頂部行之一的選擇消失。 這是我的設置UITableView的WIP圖像:

如果您點擊第3行,則所做的選擇將停留在第二行。 該功能實際上是Apple日曆應用的添加事件時間選擇屏幕的副本。

代碼出奇地兼容,一直到IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

這與將選擇樣式設置為無關聯,因此單元格不會在觸及事件時閃爍


如果你不想/不能使用UITableViewCellSelectionStyleNone ,你也可以將背景顏色設置為Clear來達到與UITableViewCellSelectionStyleNone相同的效果。

你會使用如下代碼:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

這可能會降低您的性能,因為您為每個單元添加了額外的彩色視圖。


您只需將此代碼放入cellForRowAtIndexPath

禁用單元格的選擇屬性:(點擊單元格時)。

cell.selectionStyle = UITableViewCellSelectionStyle.None

你可以使用這個

cell.selectionStyle = UITableViewCellSelectionStyleNone;

我正在使用這個,這對我很有用。

cell?.selectionStyle = UITableViewCellSelectionStyle.None

您也可以從故事板中完成。 單擊表格視圖單元格,然後在表格視圖單元格下的屬性檢查器中,將選擇旁邊的下拉列表更改為無。


你可以使用UITableViewCell的selectionStyle屬性

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

另外,請勿在代表下執行

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

如果您創建了Xib / Storyboard文件,那麼可以通過取消選中將tableview的setUserInteractionEnabled屬性更改為No。 這將使你的tableview為只讀。


因為我最近閱讀過這篇文章,它幫了我很大的忙,所以我想發表另一個答案來鞏固所有的答案(後人)。


所以,根據您所需的邏輯和/或結果,實際上有5種不同的答案:

1.要禁用藍色突出顯示而不更改單元格的任何其他交互:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

當我在UITableViewCell中託管一個UIButton或其他一些控件時,我會使用它,並且我希望用戶能夠與控件交互,但不能與單元本身交互。

注意 :正如Tony Million上面指出的那樣,這不會阻止tableView:didSelectRowAtIndexPath: 我通過簡單的“if”語句解決了這個問題,通常是針對該部分進行測試並避免針對特定部分採取措施。

我想要測試像這樣的細胞的攻擊的另一種方式是:

- (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

嘗試輸入:

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)
}

這是我使用的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

在cellForRowAtIndexPath中寫入這段代碼。


SWIFT的固定解決方案3

cell.selectionStyle = .none

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Objective-C的:

  1. 在代碼片段禁用突出顯示的同時,它也禁用了對didSelectRowAtIndexPath的調用。 所以如果你沒有實現didSelectRowAtIndexPath那麼使用下面的方法。 這應該在創建表格時添加。 這將在單元格內的按鈕和UITextField上工作。

    self.tableView.allowsSelection = NO;
    
  2. 在snippet下方禁用高亮顯示,並且不會禁用對didSelectRowAtIndexPath的調用。 cellForRowAtIndexPath中將單元格的選擇樣式設置為None

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. 在snippet下方禁用單元格上的所有內容。 這將禁用與buttonstextfields的交互:

    self.tableView.userInteractionEnabled = false;
    

迅速:

以下是上述Objective-C解決方案的Swift等價物:

  1. 替換第一個解決方案

    self.tableView.allowsSelection = false
    
  2. 更換第二種解決方案

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. 更換第三種解決方案

    self.tableView.userInteractionEnabled = false
    

Swift解決方案w /自定義單元格:

import Foundation

class CustomTableViewCell: UITableViewCell
{
  required init(coder aDecoder: NSCoder)
  {
    fatalError("init(coder:) has not been implemented")
  }

  override init(style: UITableViewCellStyle, reuseIdentifier: String?)
  {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.selectionStyle = UITableViewCellSelectionStyle.None
  } 
}

對我而言,以下工作正常:

tableView.allowsSelection = NO;

這意味著didSelectRowAt#根本行不通。 也就是說,觸摸表格中的一行,就不會做任何事情。 (因此,顯然,永遠不會有選擇動畫。)

(請注意,如果在單元格中有UIButton或任何其他控件,那麼當然這些控件仍然可以工作。在表格單元格中碰巧有的任何控件與UITableView允許您“選擇一行“使用didSelectRowAt# 。)


根據我自己的實施經驗,總結出我認為是正確的答案:

如果您想禁用某些單元格的選擇,請使用:

cell.userInteractionEnabled = NO;

除了阻止選擇,這也會停止tableView:didSelectRowAtIndexPath:被設置的單元格調用。 (感謝Tony Million為此答案,謝謝!)

如果您需要點擊單元格中的按鈕,則需要改為:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

你也需要忽略單元格中的任何點擊- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

如果您想禁用整個表格的選擇,請使用:

tableView.allowsSelection = NO;

(感謝Paulo De Barros,謝謝!)


我只是根據自定義要求完成多級分類。

//對值進行排序

    [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){

    ItemDetail * itemA = (ItemDetail*)a;
    ItemDetail* itemB =(ItemDetail*)b;

    //item price are same
    if (itemA.m_price.m_selling== itemB.m_price.m_selling) {

        NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];

        //if item names are same, then monogramminginfo has to come before the non monograme item
        if (result==NSOrderedSame) {

            if (itemA.m_monogrammingInfo) {
                return NSOrderedAscending;
            }else{
                return NSOrderedDescending;
            }
        }
        return result;
    }

    //asscending order
    return itemA.m_price.m_selling > itemB.m_price.m_selling;
}];

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec







ios objective-c uitableview cocoa-touch highlight