콘센트를 반복 콘텐츠 iOS에 연결할 수 없습니다


144

방금 앱을 만들고 @IBOutlet을 스토리 보드에 연결하기 시작했습니다. 기본 스타일을 사용하여 UITableViewCell 프로토 타입 셀의 레이블에 일부를 연결하고 있습니다. 연결하면 스토리 보드 에이 오류가 발생합니다.

TableViewController에서 UILabel 로의 detailText 아웃렛이 유효하지 않습니다. 콘센트는 반복 컨텐츠에 연결할 수 없습니다.

누군가 나를 도울 수 있습니까? 나는 항상 성공적인 방식으로 설정했지만 이번에는이 오류를 해결했습니다.


54
프로토 타입 셀의 레이블을 UIViewController 서브 클래스의 IBOutlet에 연결할 수 없습니다. UITableviewCell 서브 클래스의 IBOutlet에 레이블을 연결해야합니다.
Paulw11

알았어 고마워! :) 그래서 이해합니다. 왜 그런지 설명 할 수 있습니까?
Tomblasta

3
셀을 여러 개 가질 수 있고 단일 뷰 컨트롤러 만 가질 수 있으므로 어떤 셀의 레이블을 뷰 컨트롤러 IBOutlet에 연결해야합니까?
Paulw11

그렇다면 단일 뷰 컨트롤러의 셀 텍스트에 cellForRowAtIndexPath를 사용할 수 없었던 이유는 무엇입니까? 감사!
Tomblasta

3
뷰 컨트롤러가로드 될 때 아울렛이 오브젝트 (예 : 레이블)에 바인드 되었기 때문에-해당 시점에 셀이 없으므로 바인딩 할 레이블이 없으며 셀이있는 경우 바인딩하려는 셀이있는 경우
Paulw11

답변:


168

테이블 뷰 셀 서브 클래스를 작성하고 프로토 타입의 클래스로 설정하십시오. 해당 클래스에 콘센트를 추가하고 연결하십시오. 이제 셀을 구성하면 콘센트에 액세스 할 수 있습니다.


9
@ 아울렛에 액세스하는 방법에 대한 추가 정보를 추가 할 수 있습니까?
Juan Boero

1
Juan Pablo-그가 말하는 것은 커스텀 테이블 뷰 셀을 사용하는 것이 일반적이라는 것입니다. 셀을 사용하는 뷰 내에서 제약 조건에 대한 콘센트를 설정할 수는 없습니다. 대신 cellForRowAtIndexPath에서이를 수행해야합니다 (예 : customCell.constraint_row_width.constant = 25.0;
Stuart P.

70

스토리 보드를 통해 제공되는 두 가지 유형의 테이블 뷰 셀이 있습니다. 이들은 동적 프로토 타입정적 셀입니다.

여기에 이미지 설명을 입력하십시오

1. 동적 프로토 타입

이름에서이 유형의 셀은 동적으로 생성됩니다. 스토리 보드가 아닌 코드를 통해 제어됩니다. 테이블 뷰의 대리자 및 데이터 소스를 사용하여 셀 수, 셀 높이, 셀 프로토 타입을 프로그래밍 방식으로 지정할 수 있습니다.

셀을 테이블보기로 끌면 셀 프로토 타입이 선언됩니다. 그런 다음이 프로토 타입을 기반으로 셀을 얼마든지 작성하고 cellForRow프로그래밍 방식으로 메소드를 통해 테이블보기에 추가 할 수 있습니다 . 이 방법의 장점은 모든 뷰를 직접 추가 한 각 셀을 만드는 대신 하나의 프로토 타입 만 정의하면된다는 것입니다 (정적 셀 참조).

따라서이 경우 셀 프로토 타입의 UI 요소를보기 컨트롤러에 연결할 수 없습니다. 하나의 뷰 컨트롤러 오브젝트 만 시작하지만 많은 셀 오브젝트가 시작되어 테이블보기에 추가 될 수 있습니다. 하나의 뷰 컨트롤러 연결로 여러 셀을 제어 할 수 없으므로 셀 프로토 타입을 뷰 컨트롤러에 연결하는 것은 의미가 없습니다. 그렇게하면 오류가 발생합니다.

여기에 이미지 설명을 입력하십시오

이 문제를 해결하려면 프로토 타입 레이블을 UITableViewCell객체 에 연결해야 합니다. A UITableViewCell는 또한 셀의 프로토 타입이므로 원하는 수의 셀 오브젝트를 시작할 수 있으며 각 오브젝트는 스토리 보드 테이블 셀 프로토 타입에서 생성 된보기에 연결됩니다.

여기에 이미지 설명을 입력하십시오

마지막으로, cellForRow메소드에서 UITableViewCell클래스 에서 사용자 정의 셀을 작성 하고 레이블로 재미있는 일을하십시오.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. 정적 셀

반면에 정적 셀은 실제로 스토리 보드를 통해 구성됩니다. UI 요소를 각 셀로 드래그하여 작성해야합니다. 스토리 보드에서 셀 번호, 높이 등을 제어하게됩니다. 이 경우 스토리 보드에서 생성 한 것과 비교하여 휴대 전화와 완전히 동일한 테이블보기가 표시됩니다. 정적 셀은 페이지를 설정하는 데 더 자주 사용되며 셀은 많이 변경되지 않습니다.

정적 셀의 UI 요소를 제어하려면 실제로 해당 요소를보기 컨트롤러에 직접 연결하고 설정해야합니다.

여기에 이미지 설명을 입력하십시오


내 코드에 @FangmingNing, 난 여전히 텍스트 레이블을 변경할 수 없습니다, 나는 식별자가 올바른 세포라는 세포에 연결 클래스를 가지고 있지만, 여전히 변화하지
호르헤 사라이

@jorgesaraiva하자 채팅 방에서이 문제를 논의 chat.stackoverflow.com/rooms/159396/discuss
Fangming

나는 실종 되었다! YourCell . +100
Daniel Springer

6 개월 동안 코드로 프로젝트를 수행 한 후에는 항상 약간의 새로 고침을하는 것이 좋습니다.
ttorbik 2016 년

고마워, 내 문제는 셀이 아닌 ViewController에 연결한다는 것입니다.
스텔라

23

테이블보기를 사용하여 설정 및 기타 옵션 (내장 설정 앱과 같은)을 표시 하는 경우 속성 관리자 아래 에서 테이블보기 내용정적 셀로 설정할 수 있습니다 . 또한 이렇게하려면 UITableViewController 인스턴스에 테이블 뷰를 포함시켜야합니다.


이것은 더 간단하고 빠르며 허용되는 답변이어야합니다.
Jaime Agudo

5

또는 보기에서 객체를 참조하기 위해 IBOutlet 을 사용할 필요는 없습니다 . tableViewCell 의 Label에 Tag 값을 지정할 수 있습니다 ( 예 : Tag를 123으로 설정) (속성 관리자에서 수행 할 수 있음). 그런 다음

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}

매우 쉽고 간단합니다! +100
Julian Silvestri

1

나와 함께 UIViewcontroller, 그리고 그것에 사용자 정의 셀이있는 테이블 뷰가 있습니다. 나는에 UILabel의 내 출구를 매핑 UItableviewcell(가)에 UIViewController다음 오류가 발생했습니다.


당신이 사용자 정의 클래스에 정의 셀 클래스와 인스턴스화 함께 IBOutlet을
Shauket 셰이크

0

대부분의 사람들은 서브 클래 싱 UITableViewCell 이이 문제를 해결 한다고 지적했습니다 . 그러나 프로토 타입 셀 ( UITableViewCell )이 Apple에 의해 정의되어 있고 자신의 콘센트를 추가 할 수 없기 때문에 이것이 허용되지 않는 이유 입니다.


0

때로는 Xcode가 올바르게 셀 콘센트 연결을 제어하지 못했습니다.

어떻게 든 현재 셀의 레이블 / 버튼이 다른 셀에 연결되어 있습니다.이 셀을 제거하면 오류가 사라집니다.


-1

시뮬레이터를 클릭하고 창으로 이동하여 장치 베젤을 활성화하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.