source

식별자 Cell로 셀을 디큐할 수 없음 - 식별자에 대한 nib 또는 클래스를 등록하거나 스토리보드에서 프로토타입 셀을 연결해야 합니다.

nicesource 2023. 5. 29. 10:59
반응형

식별자 Cell로 셀을 디큐할 수 없음 - 식별자에 대한 nib 또는 클래스를 등록하거나 스토리보드에서 프로토타입 셀을 연결해야 합니다.

내 UITableViewController에서 다음 오류 메시지와 함께 충돌이 발생하고 있습니다.

감지되지 않은 예외 'NSInternalInconsistencyException', 이유: 'Cell 식별자로 셀을 디큐할 수 없음 - 식별자에 대한 nib 또는 클래스를 등록하거나 스토리보드에 프로토타입 셀을 연결해야 합니다.'

nib나 클래스를 등록해야 하는 것은 이해하지만 '어디서 어떻게?'는 이해하지 못합니다.

import UIKit

class NotesListViewController: UITableViewController {

    @IBOutlet weak var menuButton: UIBarButtonItem!
    
  override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self,
      selector: "preferredContentSizeChanged:",
      name: UIContentSizeCategoryDidChangeNotification,
      object: nil)
    
    // Side Menu
    
    if self.revealViewController() != nil {
        menuButton.target = self.revealViewController()
        menuButton.action = "revealToggle:"
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    
  }

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    // whenever this view controller appears, reload the table. This allows it to reflect any changes
    // made whilst editing notes
    tableView.reloadData()
  }

  func preferredContentSizeChanged(notification: NSNotification) {
    tableView.reloadData()
  }

  // #pragma mark - Table view data source

  override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
  }

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return notes.count
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath   indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    
    let note = notes[indexPath.row]
    let font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    let textColor = UIColor(red: 0.175, green: 0.458, blue: 0.831, alpha: 1)
    let attributes = [
      NSForegroundColorAttributeName : textColor,
      NSFontAttributeName : font,
      NSTextEffectAttributeName : NSTextEffectLetterpressStyle
    ]
    let attributedString = NSAttributedString(string: note.title, attributes: attributes)

    cell.textLabel?.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)

    cell.textLabel?.attributedText = attributedString
    
    return cell
  }

  let label: UILabel = {
    let temporaryLabel = UILabel(frame: CGRect(x: 0, y: 0, width: Int.max, height: Int.max))
    temporaryLabel.text = "test"
    return temporaryLabel
    }()

  override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
    label.sizeToFit()
    return label.frame.height * 1.7
  }

  override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
      notes.removeAtIndex(indexPath.row)
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
  }

  // #pragma mark - Navigation

  // In a storyboard-based application, you will often want to do a little preparation before navigation
  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if let editorVC = segue.destinationViewController as? NoteEditorViewController {

      if "CellSelected" == segue.identifier {
        if let path = tableView.indexPathForSelectedRow() {
          editorVC.note = notes[path.row]
        }
      } else if "AddNewNote" == segue.identifier {
        let note = Note(text: " ")
        editorVC.note = note
        notes.append(note)
      }
    }
  }

}

당신은 당신의 클를등수있다에 할 수 .UITableViewCell다음과 같이:

Swift 3+ 사용 시:

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

Swift 2.2 사용:

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

일한식자를별다니확합"를 확인합니다.cell에서도 됩니다.UITableViewCell.

"self한 후 클래스 을 사용하도록 위한 것입니다..self.

스토리보드에서 테이블 셀 식별자를 "셀"로 설정했습니까?

아니면 클래스를 설정했습니까?UITableViewController그 장면에서 당신의 반에?

이것은 나에게 효과가 있었습니다. 당신에게도 도움이 될 수 있습니다.

스위프트 4+ :

self.tableView.register(UITableViewCell.self, forCellWithReuseIdentifier: "cell")

스위프트 3:

self.tableView.register(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")

Swift 2.2:

self.tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")

아래 이미지와 같이 Table View Cell에 Identifier 속성을 설정해야 합니다.

여기에 이미지 설명 입력

오늘 제품 -> 클린을 선택하여 해결한 문제가 있었습니다.나는 내 코드가 적절해서 너무 혼란스러웠습니다.문제는 명령-Z를 너무 많이 사용하는 것에서 시작되었습니다 :)

y 내 경우 테이블 보기 셀의 "식별자" 속성에서 이름을 지정하여 이 문제를 해결했습니다.

여기에 이미지 설명 입력

잊지 마세요: 클래스에서 선언하기: UITableViewDataSource

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

TableViewController에서 했던 것처럼 셀을 드래그하여 TableViewController에서 해제하기만 하면 셀을 추가할 수 있습니다.셀을 클릭하시고요.속성 검사기로 이동하여 식별자를 "셀"로 설정합니다.효과가 있기를 바랍니다.


속성 검사기에 식별자를 지정해야 한다는 것을 잊지 마십시오.

("ID 검사자"의 "복원 ID"가 아님!)

두 위치의 식별자 이름 일치

이 오류는 테이블 셀의 식별자 이름이 Swift 파일과 Storyboard에서 다를 때 발생합니다.

예를 들어, 이 경우 식별자는 placecellIdentifier입니다.

스위프트 파일

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "placecellIdentifier", for: indexPath)
    
    // Your code 

    return cell
}

스토리보드

여기에 이미지 설명 입력

이 문제가 발생하는 또 다른 이유는 이전 문제입니다.새 ViewController를 표시할 때 대상 ViewController를 직접 인스턴스화하면 당연히 StoryBoard에서 프로토타입 셀이 로드되지 않습니다.올바른 해결책은 항상 다음과 같이 스토리보드를 통해 뷰 컨트롤러를 인스턴스화하는 것입니다.

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

Swift 3.0에서 다음과 같이 UITableViewCell에 클래스를 등록합니다.

tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell")

셀을 정의할 수 있는 두 가지 방법이 있습니다.테이블 셀이 View Controller의 내부에 있는 경우 다음 방법으로 셀을 가져옵니다.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
        // write your code here 
        return cell
}

그러나 View 컨트롤러 외부에서 셀을 정의하는 경우 다음과 같이 판매를 요청합니다.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = Bundle.main.loadNibNamed("TableViewCell", owner: self, options: nil)?.first as! TableViewCell
        // write your code here
        return cell
    }

모두가 말했듯이 셀 식별자를 설정하는 것을 잊지 마십시오.

여기에 이미지 설명 입력

바보 같은 실수:

를 추가해야 합니다.register(TableViewCell.self, forCellReuseIdentifier: "Cell")register(TableViewCell.self, forHeaderFooterViewReuseIdentifier: "Cell")

저도 같은 문제가 있었습니다.이 문제는 저에게 효과가 있었습니다.스토리보드에서 테이블 뷰를 선택하고 정적 셀에서 동적 셀로 변경합니다.

제 문제는 디스패치 큐에 테이블 뷰 셀을 비동기식으로 등록하는 것이었습니다.스토리보드에 테이블 뷰 소스 및 위임 참조를 등록한 경우, 디스패치 대기열은 셀 등록을 지연시킵니다. 이름에 따라 셀 등록이 비동기적으로 수행되고 테이블 뷰가 셀을 찾고 있습니다.

DispatchQueue.main.async {
    self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
    self.tableView.reloadData()
}

등록을 위해 발송 대기열을 사용하지 않거나 다음 작업을 수행해야 합니다.

DispatchQueue.main.async {
    self.tableView.dataSource = self
    self.tableView.delegate = self
    self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
    self.tableView.reloadData()
}

를 통해 에 배치합니다.UICollectionView또는UITableView:

셀을 생성한 실제 클래스와 바인딩했는지 확인하십시오. 매우 중요한 것은 "대상에서 모듈 상속"을 선택한 것입니다.

예전에는 swift 3, swift 4로 작동했지만 지금은 작동하지 않습니다.

맘에 들다

self.tableView.register(MyTestTableViewCell.self, forCellReuseIdentifier: "cell")

그래서 swift 5에서 위에 언급된 해결책들을 대부분 시도해보았지만 아무런 운을 얻지 못했습니다.

결국 저는 이 해결책을 시도했고 그것은 저에게 효과가 있었습니다.

override func viewDidLoad() 
{

    tableView.register(UINib.init(nibName: "MyTestTableViewCell", bundle: nil), forCellReuseIdentifier: "myTestTableViewCell")
}

UITableViewCell에서 를 등록할 했습니다.viewDidLoad()이 오류를 던진 것입니다.그것을 고치기 위해 내가 한 일은 세포를 등록하는 것이었습니다.didSet에 관찰자

@IBOutlet tableview : UITableView! {
    didSet {
        tableview.register(CustomCell.self, forCellReuseIdentifier: "Cell")
    }
}

저는 방금 같은 문제를 만나 이 게시물을 보았습니다.저는 다른 답변에서 언급한 것처럼 셀의 식별자 설정을 잊어버렸기 때문입니다.제가 말하고 싶은 것은 스토리보드를 사용하여 커스텀 셀을 로드하는 경우 테이블 뷰 셀을 코드로 등록할 필요가 없으므로 다른 문제가 발생할 수 있습니다.

자세한 내용은 다음 게시물을 참조하십시오.

사용자 지정 테이블 뷰 셀: IBOutlet 레이블이 0입니다.

스위프트 5

viewDidLoad에 셀을 등록하려면 UINib 방법을 사용해야 합니다.

override func viewDidLoad() 
{
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    //register table view cell        
    tableView.register(UINib.init(nibName: "CustomTableViewCell", bundle: nil), forCellReuseIdentifier: "CustomTableViewCell")
}

테이블 보기에서 단위 테스트를 수행하는 사람이 있는데 왜 이 오류가 나타나는지 궁금하다면 텍스트 고정 장치를 사용하는 경우 setUp(설정) 기능에서 테스트 대상 시스템(SUT)을 올바르게 선언해야 합니다. 그렇지 않으면 이 오류가 계속 발생합니다.loadView라고 부르는 것도 중요합니다.필요한 경우 코드와 스토리보드 사이의 콘센트가 연결됩니다.

override func setUp() {
        super.setUp()
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)           
        
        sutSearch = storyboard.instantiateViewController(identifier:String(describing: SearchTableViewController.self))
        
        sutSearch.loadViewIfNeeded() // To make sure your outlets are connected.
        
    }

여러 개의 셀과 다른 xib 파일을 사용하기로 결정한 새로운 iOS 친구들(나와 같은)을 위한 해결책은 식별자가 아니라 다음과 같습니다.

let cell = Bundle.main.loadNibNamed("newsDetails", owner: self, options: nil)?.first as! newsDetailsTableViewCell

here newsDetails는 xib 파일 이름입니다.

하위 클래스 필드에서 UITableViewController를 선택합니다.

클래스 제목이 xxxxTableViewController로 변경됩니다.그것은 그대로 둬라.

"XIB 파일도 작성" 옵션이 선택되어 있는지 확인합니다.

IB의 UITableView가 Cmd-C - Cmd-V로 다른 하위 보기로 이동되었을 때 이 메시지가 표시되었습니다.

IB의 모든 식별자, 위임 메서드, 링크 등은 그대로 유지되지만 런타임에 예외가 발생합니다.

유일한 해결책은 IB(아울렛, 데이터 소스, 대리인)의 테이블 뷰와 관련된 모든 링크를 지우고 다시 만드는 것입니다.

셀 식별자로 작성된 속성에 식별자가 있는지 확인합니다.

저도 같은 문제로 어려움을 겪고 있었습니다.저는 실제로 클래스를 삭제하고 다시 만들었습니다.누군가, 스토리보드가 프로토타입 셀과 식별자 사이의 연결을 끊었습니다.

식별자 이름을 삭제하고 식별자 이름을 다시 입력했습니다.

효과가 있었습니다.

클래식 솔루션(코드 또는 IB의 클래스에 대한 레지스터 식별자)이 작동하지 않는 경우: Xcode를 다시 시작하려고 하면 스토리보드가 재사용 식별자 설정을 포함하여 만든 편집 저장을 중지한 것으로 나타났습니다.

동적 테이블 뷰는 스토리보드에 셀 식별자가 설정된 상태에서 올바르게 작동했습니다.dequeueReusableCell(withIdentifier:.

그런 다음 UITableView 컨텐츠를 동적 프로토타입에서 정적 셀로 전환했습니다.

셀의 식별자가 스토리보드에서 동일한 값으로 설정되었지만 앱을 실행하면 바로 오류가 발생했습니다.

정적 테이블 보기의 경우 스토리보드 외부에 셀 식별자를 등록해야 합니다.

tableView.register(EntryNutritionCell.self, forCellReuseIdentifier: "Cell")

또는 코멘트 아웃 또는 제거cellForRowAtIndexPath:전적으로.이 기능은 정적 테이블 보기에서 실제로 사용되지는 않지만 여전히 호출(?)되어 충돌을 일으킵니다.

//    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
//        return cell
//    }

'Table View Cell' 식별자는 클래스 식별자와 일치해야 합니다.

ex: 'Table View Cell' 식별자의 이름이 "myCellId"인 경우 코드는 다음과 같아야 합니다.

let myCell = tableView.dequeueReusableCell(withIdentifier: "myCellId", for: indexPath).

또한 몇 시간 동안 문제를 해결한 후에 저는 제 didLoad()에 GestureRecognizer 클래스가 있다는 것이 테이블 셀을 클릭하는 것을 허용하지 않는다는 것을 깨달았습니다. 그래서 didLoad()에서 모든 '키보드 숨기기' 기능을 제거하고 다른 추가 코드를 사용하여 해결했습니다.

저도 같은 문제로 고민하고 있었습니다.나는 이미 내 재사용 가능한 셀 식별자를 확인했습니다. 그것은 내 코드와 동일합니다.코드 행을 삭제했습니다.

"let Cell = tableView.dequeueReusableCell(식별자: "CELL", for: indexPath)"

깨끗한 빌드를 만들고 다시 작성합니다!

효과가 있었습니다.

언급URL : https://stackoverflow.com/questions/29282447/unable-to-dequeue-a-cell-with-identifier-cell-must-register-a-nib-or-a-class-f

반응형