ios - uitableviewcell




UITableview:如何禁用某些行而不是其他的選擇 (13)

我在從XML解析的組tableview內容中顯示。 我想禁用它的點擊事件(我不應該能夠點擊它)表中包含兩個組。 我想禁用第一個組的選擇,但不是第二個組。 點擊第二組的第一行navigates到我的管player view

我如何才能使特定的組或行可選?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if(indexPath.section!=0)
    if(indexPath.row==0)    

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];   
}

謝謝。


簡單

只需使用cell.userInteractionEnabled = YES; 到單元格,如果它可以導航和cell.userInteractionEnabled = NO; 除此以外


上述答案中沒有一個能夠真正解決問題。 原因是我們想要禁用單元格的選擇,但不一定是單元格內的子視圖。

在我的情況下,我在該行中間提供了一個UISwitch,並且我想禁用該行其餘部分(這是空的)的選擇,但不適用於交換機! 這樣做的正確方法就是這種方法

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

哪裡有表格的陳述

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

禁用特定單元的選擇,同時允許用戶操作開關並因此使用適當的選擇器。 這是不正確的,如果有人通過禁用用戶交互

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法,它只准備單元並且不允許與UISwitch交互。

此外,使用該方法

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

以便通過表單聲明取消選擇單元格

[tableView deselectRowAtIndexPath:indexPath animated:NO];

仍然顯示當用戶按下單元格的原始內容視圖時正在選擇的行。

只是我的兩分錢。 我很確定很多人會覺得這很有用。


使用它可以使單元看起來像禁用和不可選:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

重要提示:請注意,這只是樣式屬性,並不會真正禁用單元格。 為此,您必須在didSelectRowAtIndexPath: delegate實現中檢查selectionStyle

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(cell.selectionStyle == UITableViewCellSelectionStyleNone) {
        return;
    }

    // do your cell selection handling here
}

在你的表的數據源中只實現tableView:willSelectRowAtIndexPath:方法。 如果您希望路徑中的行突出顯示,請返回給定的indexPath。 如果你不這樣做,則返回零。

來自我的應用的示例:

- (NSIndexPath *)tableView:(UITableView *)tableView
    willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MySelectableObj* obj = [self objectAtPath:indexPath];
    if(obj==nil) return nil;
    return indexPath;
}

關於這一點的shouldPerformSegueWithIdentifier:sender:是, shouldPerformSegueWithIdentifier:sender:如果上述方法返回nil,將不會被調用,儘管為了完整性我重複上面的測試。


如果你想使行(或行的子集)不可選,實現UITableViewDelegate方法-tableView:willSelectRowAtIndexPath :( TechZen也提到)。 如果indexPath不能選擇,則返回nil,否則返回indexPath。 要獲得默認選擇行為,只需返回傳遞給委託方法的indexPath,但也可以通過返回不同的indexPath來更改行選擇。

例:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // rows in section 0 should not be selectable
    if ( indexPath.section == 0 ) return nil;

    // first 3 rows in any section should not be selectable
    if ( indexPath.row <= 2 ) return nil;

    // By default, allow row to be selected
    return indexPath;
}

對於Xcode 6.3:

 cell.selectionStyle = UITableViewCellSelectionStyle.None;

從iOS 6開始,您可以使用

-tableView:shouldHighLightRowAtIndexPath:

如果您返回NO ,則會禁用選擇突出顯示以及連接到該單元格的故事板觸發的連線。

當觸摸在一行上下來時調用該方法。 將NO返回到該消息會暫停選擇過程,並且不會導致當前選定的行在觸摸關閉時失去其選定的外觀。

UITableViewDelegate協議參考


您只需將此代碼放入cellForRowAtIndexPath

禁用單元格的選擇property:點擊單元格時)。

cell.selectionStyle = UITableViewCellSelectionStyle.none

為了能夠選擇(點擊) cell:點擊單元格)。

// Default style
cell.selectionStyle = UITableViewCellSelectionStyle.blue

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyle.gray

請注意,具有selectionStyle = UITableViewCellSelectionStyleNone的單元格仍然會導致UI在用戶觸摸時調用didSelectRowAtIndexPath 。 為了避免這種情況,請按照下面的建議進行設置。

cell.userInteractionEnabled = false

代替。 另請注意,您可能需要設置cell.textLabel.enabled = false以灰顯該項目。


您可以使用這些數據源方法來捕獲選擇。

– tableView:willSelectRowAtIndexPath: 
– tableView:didSelectRowAtIndexPath: 
– tableView:willDeselectRowAtIndexPath: 
– tableView:didDeselectRowAtIndexPath:

在這些方法中,你檢查選中的行是否是你想要選擇的行。 如果是,則採取行動,如果沒有,則什麼也不做。

不幸的是,你不能僅關閉一個部分的選擇。 這是整個桌子或什麼都沒有。

但是,您可以將表格單元格的selectionStyle屬性設置為UITableViewCellSelectionStyleNone 。 我相信這會讓選擇看不見。 結合上述方法,應該使用戶的角度看起來完全惰性。

Edit01:

如果您的表中只有一些行是可選的,則可選行的單元格在視覺上與非可選行不同。 V形配件按鈕是執行此操作的默認方式。

然而,你這樣做,你不希望你的用戶試圖選擇行,並認為該應用程序已經發生故障,因為該行不做任何事情。


您需要執行以下操作來禁用cellForRowAtIndexPath方法中的單元格選擇:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];

要將單元格顯示為灰色,請在tableView:WillDisplayCell:forRowAtIndexPath以下內容tableView:WillDisplayCell:forRowAtIndexPath方法:

[cell setAlpha:0.5];

一種方法允許您控制交互性,另一種方法允許您控制UI外觀。


我發現這很方便,因為它可以同時用於靜態和動態表格。 我只在我希望允許選擇的單元上設置披露指標。

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
        return nil;
    }
    return indexPath;
}

我的解決方案基於數據模型:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled ? indexPath : nil
}

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled
}

要停止僅選擇一些單元格,請使用:

cell.userInteractionEnabled = NO;

除了阻止選擇,這也會停止tableView:didSelectRowAtIndexPath:被設置的單元格調用。





uitableview