[ios] UITableview : 일부 행에 대해서는 선택을 비활성화하지만 다른 행에는 선택하지 않는 방법

tableviewXML에서 파싱 된 그룹 내용으로 표시하고 있습니다. 클릭 이벤트를 비활성화하고 싶습니다 (전혀 클릭 할 수 없어야 함). 테이블에는 두 그룹이 있습니다. 첫 번째 그룹의 선택 만 비활성화하고 두 번째 그룹은 선택 해제하고 싶습니다. navigates내 그룹에 두 번째 그룹의 첫 번째 행을 클릭합니다 player view.

특정 그룹이나 행만 선택 가능하게하려면 어떻게해야합니까?

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

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

감사.



답변

이 코드를 넣어야합니다 cellForRowAtIndexPath

셀의 선택 속성을 비활성화하려면 : (셀을 탭하는 동안)

cell.selectionStyle = UITableViewCellSelectionStyleNone;

셀을 선택 (탭) 할 수있게하려면 : (셀을 탭)

// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;

셀이 selectionStyle = UITableViewCellSelectionStyleNone;있으면 didSelectRowAtIndexPath사용자가 터치해도 UI가 호출 됩니다. 이를 피하려면 아래 제안 된대로 설정하십시오.

cell.userInteractionEnabled = NO;

대신에. cell.textLabel.enabled = NO;항목을 회색으로 표시 하도록 설정할 수도 있습니다 .


답변

행 (또는 행의 서브 세트) 을 선택 불가능하게 하려면 UITableViewDelegate메소드 -tableView:willSelectRowAtIndexPath:(TechZen에 의해 언급 됨)를 구현하십시오 . 을 선택할indexPath 수없는 경우을 반환 nil하고 그렇지 않으면를 반환합니다 indexPath. 기본 선택 동작을 얻으려면 indexPath전달 된 delegate메소드로 반환하지만 다른을 반환하여 행 선택을 변경할 수도 있습니다 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;
}


답변

iOS 6부터 사용할 수 있습니다

-tableView:shouldHighlightRowAtIndexPath:

을 반환 NO하면 선택 강조 표시와 해당 셀에 연결된 스토리 보드 트리거 된 segue가 모두 비활성화됩니다.

터치가 연속으로 내려 오면 메소드가 호출됩니다. NO해당 메시지 로 되돌아 가면 선택 프로세스가 중단되고 터치가 눌려져있는 동안 현재 선택된 행이 선택된 모양을 잃지 않습니다.

UITableViewDelegate 프로토콜 참조


답변

위의 답변에서 실제로 문제를 올바르게 해결하는 것은 없습니다. 그 이유는 셀 선택을 비활성화하고 셀 내부의 하위 뷰를 반드시 비활성화하지 않기 때문입니다.

필자의 경우 행 중간에 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];

사용자가 셀의 원래 contentView를 누를 때 선택된 행이 여전히 표시됩니다.

내 두 센트. 나는 이것이 많은 사람들이 이것을 유용하게 사용할 것이라고 확신한다.


답변

이러한 데이터 소스 방법으로 선택을 트랩합니다.

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

이 방법에서는 선택한 행이 선택 가능한 행인지 확인합니다. 그렇다면, 조치를 취하십시오. 그렇지 않으면 조치를 취하지 마십시오.

불행히도 한 섹션에 대해서만 선택을 해제 할 수 없습니다. 그것은 전체 테이블이거나 아무것도 아닙니다.

그러나 테이블 셀 selectionStyle속성을로 설정할 수 있습니다UITableViewCellSelectionStyleNone . 나는 그것이 선택을 보이지 않게 할 것이라고 믿는다. 셀이 사용자의 관점에서 완전히 비활성으로 보이도록하는 위의 방법과 결합되었습니다.

편집 01 :

일부 행만 선택할 수있는 테이블이있는 경우 선택 가능한 행의 셀을 선택 불가능한 행과 시각적으로 구분해야합니다. 쉐브론 액세서리 버튼이 기본 방법입니다.

그러나 그렇게하면 사용자가 행을 선택하고 행이 아무것도하지 않기 때문에 앱이 잘못 입력되었다고 생각하는 것을 원하지 않습니다.


답변

예 를 들어 Swift 4.0의 경우 :

cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5


답변

cellForRowAtIndexPath메소드 내에서 셀 선택을 사용하지 않으려면 다음과 같은 작업을 수행해야합니다 .

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

셀이 회색으로 표시되도록하려면 tableView:WillDisplayCell:forRowAtIndexPath메소드 내에 다음을 입력하십시오 .

[cell setAlpha:0.5];

하나는 인터랙티비티를 제어하고 다른 하나는 UI 모양을 제어 할 수 있습니다.