식별자 Cell이있는 셀을 대기열에서 빼낼 수 없음-식별자에 대한 펜촉 또는 클래스를 등록하거나 스토리 보드의 프로토 타입 셀을 연결해야합니다.


114

저는 일반적으로 코딩에 익숙하지 않고 Xcode (Swift)를 처음 사용합니다. 펜촉이나 수업을 등록해야한다는 것을 알고 있지만 '어디에서 어떻게?'를 이해하지 못합니다.

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

}

11
혼란스러운 "복원 ID"에주의하십시오. 이것은 아무것도 아닙니다! 번째 탭이 아닌 오른쪽 상단 의 네 번째 탭을 클릭 하세요 !!
Fattie 2011

답변:


82

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

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


102

다음 UITableViewCell과 같이 수업을 등록 할 수 있습니다 .

Swift 3+ 사용 :

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

Swift 2.2 사용 :

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

동일한 식별자 " cell"가 스토리 보드의 UITableViewCell.

" self"는 클래스 이름 뒤에 .self.


1
이거 어디에 두세요?
RJB

7
in viewDidLoad()
Mette 2017

18
: 당신이 당신의 정의 셀의 XIB를 사용하는 경우, 당신은 이런 식으로 등록해야합니다tableView.register(UINib.init(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
atulkhatri

빠른 5 나를 위해 일한 위의 신속한 3+ 솔루션
마이크 볼 마르

38

이것은 나를 위해 일했습니다. 당신도 도울 수 있습니다.

Swift 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")

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

여기에 이미지 설명 입력


1
:-) 그냥 너무 간단
뤽 - 올리비에

1
작동했습니다! 나는 idendity inspector에서 ID를 설정하고 있었지만 속성 inspector에 붙여
넣으면

1
하나님의 축복이 있기를! 내 일생의 두세를 구했습니다
Ragen Dazs

26

오늘이 문제는 제품-> 청소를 선택하여 해결되었습니다. 내 코드가 적절했기 때문에 너무 혼란 스러웠습니다. command-Z를 너무 많이 사용하여 문제가 시작되었습니다. :)


1
이것을 디버깅하는 데 한 시간 이상을 보냈습니다. 감사합니다 :)
ewakened

물론 스토리 보드에서 식별자를 정의하는 것과 함께 작동합니다 (다음 답변 참조)
Nech

21

y 내 경우에는 Table View Cell의 "Identifier"속성에 이름을 지정하여이 문제를 해결했습니다.

여기에 이미지 설명 입력

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

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

이 사진은 일치하지 않지만 약간의 힌트를주었습니다.
Martian2049

그것은 약간 오래된 것입니다
Martian2049

13

(TableViewController에서했던 것처럼) 셀을 드래그하고 TableViewController에서 셀을 해제하여 추가하면됩니다. 셀을 클릭하고 속성 관리자로 이동하여 식별자를 "셀"로 설정합니다. 작동하기를 바랍니다.


Attributes Inspector 에서 Identifier 를 원한다는 것을 잊지 마십시오 .

( "Identity Inspector"의 "복원 ID"가 아닙니다 !)


6
혼란스러운 "복원 ID"에주의하십시오. 이것은 아무것도 아닙니다! 오른쪽 상단의 세 번째 탭이 아닌 네 번째 탭을 클릭하세요 !!!
Fattie

9

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

storyboard?.instantiateViewController(withIdentifier: "some_identifier")

예!! 사실이야 !! 이것은 self.present (MyViewController, animated : false, complete : nil)와 함께 다른 Storyboard에있는 ViewController로 전환했기 때문에 발생했습니다. 그리고 실제로 프로토 타입을 다운로드하지 않는 것 같습니다! MyViewController로 직접 시작하려고했는데 제대로 작동합니다! 대상 ViewController의 viewDidLoad에서 내 셀에 대한 NIB를 등록 할 때도 작동합니다.
Vitya Shurapov

7

두 위치에서 식별자 이름을 일치시킵니다.

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

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

1) 스위프트 파일

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

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

    // Your code 

    return cell
}

2) 스토리 보드

여기에 이미지 설명 입력


5

Swift 3.0에서 다음과 같이 UITableViewCell에 대한 클래스를 등록하십시오.

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

2

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


2

Interface Builder를 통해 셀을 정의한 경우 UICollectionView, 또는 내부에 셀을 배치합니다 UITableView.

생성 한 실제 클래스로 셀을 바인딩했는지 확인하고, "대상에서 모듈 상속"을 선택했는지 매우 중요합니다.


2

예전에는 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")
}

2

내 문제는 디스패치 큐 내에 테이블 뷰 셀을 비동기 적으로 등록하는 것입니다. 테이블 뷰 소스를 등록하고 스토리 보드에 참조를 위임 한 경우 디스패치 큐는 이름이 비동기 적으로 발생하고 테이블 뷰가 셀을 찾고 있음을 암시하는 것처럼 셀 등록을 지연시킵니다.

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

1

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

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

사용자 정의 테이블보기 셀 : IBOutlet 레이블이 nil입니다.


0

여러 셀과 다른 xib 파일을 사용하기로 결정한 iOS 친구 (나와 같은)를 처음 접하는 사람들에게 해결책은 식별자가 아니라 다음과 같이하는 것입니다.

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

여기 newsDetails 는 xib 파일 이름입니다.


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

0

"Subclass of"필드에서 UITableViewController를 선택하십시오.

클래스 제목이 xxxxTableViewController로 변경됩니다. 그대로 두십시오.

"Also create XIB file"옵션이 선택되어 있는지 확인하십시오.


0

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

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

유일한 해결책은 IB (아울렛, 데이터 소스, 델리게이트)의 tableview와 관련된 모든 잉크를 지우고 다시 만드는 것입니다.

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