私はコーディング全般はかなり新しく、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)
}
}
}
}
ストーリーボードでTable Cell identifierを "Cell"に設定しましたか?
または、UITableViewController
のクラスをそのシーンのクラスに設定しましたか?
次のようにUITableViewCell
のクラスを登録できます。
with Swift 3 +:
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
with Swift 2.2:
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
ストーリーボードのcell
にも同じ識別子「UITableViewCell
」がコピーされていることを確認してください。
「self
」は、クラスに.self
が続くクラス名を使用させるためのものです。
これは私のために働いた、あなたにも役立つかもしれません:
Swift 4+:
self.tableView.register(UITableViewCell.self, forCellWithReuseIdentifier: "cell")
Swift 3:
self.tableView.register(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")
Swift 2.2:
self.tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "Cell")
下の画像のように、テーブルビューセルにIdentifierプロパティを設定する必要があります。
今日、この問題が発生しましたが、[製品]-> [クリーン]を選択して解決しました。私のコードが適切だったので、私はとても混乱しました。問題はcommand-Zの使用回数が多すぎることから始まりました:)
(TableViewControllerで行ったように)セルをドラッグし、TableViewControllerでセルを解放するだけで追加します。セルをクリックし、属性インスペクターに移動して、識別子を「セル」として設定します。
Attributes InspectorのIdentifierが欲しいことを忘れないでください。
(NOT「Identity Inspector」の「復元ID」!)
この問題が発生するもう1つの理由は、以前の問題です。新しいViewControllerを表示する場合、ターゲットViewControllerを直接インスタンス化しても、もちろんStoryBoardからプロトタイプセルは読み込まれません。正しい解決策は常に、ストーリーボードを通じて次のようにView Controllerをインスタンス化することです。
storyboard?.instantiateViewController(withIdentifier: "some_identifier")
Swift 3.0で、次のようにUITableViewCellのクラスを登録します。
tableView.register(UINib(nibName: "YourCellXibName", bundle: nil), forCellReuseIdentifier: "Cell")
Interface Builderでセルを定義した場合、UICollectionView
またはUITableView
内にセルを配置します。
作成した実際のクラスにセルをバインドしたことを確認してください。非常に重要なのは、「ターゲットからモジュールを継承する」をチェックしたことです。
同じ問題がありました。この問題はうまくいきました。ストーリーボードでテーブルビューを選択し、静的セルから動的セルに変更します。
私はちょうど同じ問題に出会い、この投稿を参照しました。私にとっては、他の回答でも述べたように、セルの識別子を設定するのを忘れたからです。私が言いたいのは、ストーリーボードを使用してカスタムセルを読み込む場合、コードでテーブルビューセルを登録する必要がないため、他の問題が発生する可能性があるということです。
詳細については、この投稿を参照してください。
static var identifier:String {return String(describing:self)}
static var nib : UINib {
return UINib(nibName: identifier, bundle: nil)
}
以前は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")
}
複数のセルと異なるxibファイルを使用することにしたiOSの仲間(私のような)にとっては、解決策は識別子を持たずにこれを行うことです:
let cell = Bundle.main.loadNibNamed("newsDetails", owner: self, options: nil)?.first as! newsDetailsTableViewCell
here newsDetailsはxibファイル名です。
Swift 5
viewDidLoadでセルを登録するには、INibメソッドを使用する必要があります
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")
}
[サブクラス]フィールドで、UITableViewControllerを選択します。
クラスのタイトルがxxxxTableViewControllerに変わります。そのままにしておきます。
「XIBファイルも作成する」オプションが選択されていることを確認します。
私の問題は、ディスパッチキュー内のテーブルビューセルを非同期に登録していたことです。テーブルビューのソースとデリゲート参照をストーリーボードに登録している場合、ディスパッチキューは名前が非同期に発生することを示唆し、テーブルビューがセルを探しているため、セルの登録を遅延させます。
DispatchQueue.main.async {
self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
self.tableView.reloadData()
}
登録にディスパッチキューを使用しないでくださいORこれを行います:
DispatchQueue.main.async {
self.tableView.dataSource = self
self.tableView.delegate = self
self.tableView.register(CampaignTableViewCell.self, forCellReuseIdentifier: CampaignTableViewCell.identifier())
self.tableView.reloadData()
}