私はペン先からカスタムのテーブルビューセルを作成しようとしています。私はこの記事を参照しています ここ 。私は二つの問題に直面しています。
UITableViewCellオブジェクトをドラッグした状態で.xibファイルを作成しました。 UITableViewCell
のサブクラスを作成し、それをセルのクラスとして設定し、Cellを再利用可能な識別子として設定しました。
import UIKit
class CustomOneCell: UITableViewCell {
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
UITableViewControllerでは、私はこのコードを持っています、
import UIKit
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let identifier = "Cell"
var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
if cell == nil {
tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
}
return cell
}
}
このコードはエラーなしで準拠していますが、シミュレータで実行すると、このようになります。
ストーリーボードのUITableViewControllerでは、セルには何もしていません。空白の識別子でサブクラスはありません。プロトタイプセルにCell識別子を追加して再度実行しましたが、同じ結果が得られます。
私が直面したもう一つのエラーは、私がUITableViewControllerで以下のメソッドを実装しようとしたときです。
override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
}
私が述べた記事で示したように、私はcell
パラメータの型をUITableViewCell
からUITableViewCellのサブクラスであるCustomOneCell
に変更しました。しかし、私は次のエラーが出ます、
セレクタ 'tableView:willDisplayCell:forRowAtIndexPath:'のオーバーライドメソッドの型が互換性がありません '(UITableView!、CustomOneCell!、NSIndexPath!) - >()'
誰もがこれらのエラーを解決する方法を知っていますか? Objective-Cでは、これらはうまく機能しているようです。
ありがとうございました。
編集:シミュレータの向きを横に変更して縦に戻すと、セルが表示されます。何が起こっているのかまだわかりませんでした。私はXcodeプロジェクトをアップロードしました ここ あなたがちょっと見てみる時間があるなら問題を実証します。
あなたのプロジェクトのために次のコードを試すべきです:(Swift 3+のための構文)
CustomOneCell.Swift
import UIKit
class CustomOneCell: UITableViewCell {
// Link those IBOutlets with the UILabels in your .XIB file
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
}
TableViewController.Swift
import UIKit
class TableViewController: UITableViewController {
let items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(nibName: "CustomOneCell", bundle: nil), forCellReuseIdentifier: "CustomCellOne")
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomCellOne", forIndexPath: indexPath) as! CustomOneCell
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
return cell
}
}
以下の画像は、Xcodeからの制約のあいまいさメッセージなしで提供されたコードで機能する一連の制約を示しています。
これがSwift 2とXcode 7.3を使った私のアプローチです。この例では、1つのViewControllerを使用して2つの.xibファイルをロードします。1つはUITableView用、もう1つはUITableCellView用です。
この例では、UITableViewを空のTableNib。xibファイルに直接ドロップできます。内部で、ファイルの所有者をあなたのViewControllerクラスに設定し、アウトレットを使ってtableViewを参照します。
そして
これで、View Controllerで、通常どおりにtableViewを委任できます。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
...
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Table view delegate
self.tableView.delegate = self
self.tableView.dataSource = self
...
カスタムセルを作成するには、Table View Cellオブジェクトを空のTableCellNib。xibファイルにドロップします。今回は、セル.xibファイルで「所有者」を指定する必要はありませんが、カスタムクラスとを指定する必要があります。 "TableCellId"のような識別子
必要なアウトレットを使ってサブクラスを作成します。
class TableCell: UITableViewCell {
@IBOutlet weak var nameLabel: UILabel!
}
最後に... View Controllerに戻って、全体をロードして表示することができます
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// First load table nib
let bundle = NSBundle(forClass: self.dynamicType)
let tableNib = UINib(nibName: "TableNib", bundle: bundle)
let tableNibView = tableNib.instantiateWithOwner(self, options: nil)[0] as! UIView
// Then delegate the TableView
self.tableView.delegate = self
self.tableView.dataSource = self
// Set resizable table bounds
self.tableView.frame = self.view.bounds
self.tableView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
// Register table cell class from nib
let cellNib = UINib(nibName: "TableCellNib", bundle: bundle)
self.tableView.registerNib(cellNib, forCellReuseIdentifier: self.tableCellId)
// Display table with custom cells
self.view.addSubview(tableNibView)
}
このコードは、単純にnibファイル(テーブル)を読み込んで表示する方法と、次にセルで使用するためのnibを登録する方法を示しています。
お役に立てれば!!!
スイフト4
登録ペン先
tblMissions.register(UINib(nibName: "MissionCell", bundle: nil), forCellReuseIdentifier: "MissionCell")
TableViewデータソース内
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "MissionCell", for: indexPath) as? MissionCell else { return UITableViewCell() }
return cell
}
あなたのために働くかもしれないもう一つの方法(それは私がそれをする方法です)はクラスを登録することです。
次のようにカスタムのtableViewを作成するとします。
class UICustomTableViewCell: UITableViewCell {...}
その後、このセルを "registerClass"を使用して表示するUITableViewControllerに登録します。
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerClass(UICustomTableViewCell.self, forCellReuseIdentifier: "UICustomTableViewCellIdentifier")
}
行メソッドのセルで期待どおりに呼び出すことができます。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("UICustomTableViewCellIdentifier", forIndexPath: indexPath) as! UICustomTableViewCell
return cell
}
以下のようにペン先を登録しませんでした。
tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")
"Overriding method ...は型に互換性がありません..." errorを修正するために、関数宣言をに変更しました。
override func tableView(tableView: (UITableView!),
cellForRowAtIndexPath indexPath: (NSIndexPath!))
-> UITableViewCell {...}
(-> UITableViewCell!
- 末尾に感嘆符付き)
スイフト4.1.2
xib.
ImageCell2.Swiftを作成します。
ステップ1
import UIKit
class ImageCell2: UITableViewCell {
@IBOutlet weak var imgBookLogo: UIImageView!
@IBOutlet weak var lblTitle: UILabel!
@IBOutlet weak var lblPublisher: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
ステップ2 。 ViewControllerクラスに準拠
import UIKit
class ImageListVC: UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet weak var tblMainVC: UITableView!
var arrBook : [BookItem] = [BookItem]()
override func viewDidLoad() {
super.viewDidLoad()
//Regester Cell
self.tblMainVC.register(UINib.init(nibName: "ImageCell2", bundle: nil), forCellReuseIdentifier: "ImageCell2")
// Response Call adn Disply Record
APIManagerData._APIManagerInstance.getAPIBook { (itemInstance) in
self.arrBook = itemInstance.arrItem!
self.tblMainVC.reloadData()
}
}
//MARK: DataSource & delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.arrBook.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// [enter image description here][2]
let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCell2") as! ImageCell2
cell.lblTitle.text = self.arrBook[indexPath.row].title
cell.lblPublisher.text = self.arrBook[indexPath.row].publisher
if let authors = self.arrBook[indexPath.row].author {
for item in authors{
print(" item \(item)")
}
}
let url = self.arrBook[indexPath.row].imageURL
if url == nil {
cell.imgBookLogo.kf.setImage(with: URL.init(string: ""), placeholder: UIImage.init(named: "download.jpeg"))
}
else{
cell.imgBookLogo.kf.setImage(with: URL(string: url!)!, placeholder: UIImage.init(named: "download.jpeg"))
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 90
}
}
単純なクラスUITableViewCellとxibを取る。必要に応じてUIを設定し、IBOutletを割り当てます。このようにテーブルビューのcellForRowAt()で使用してください。
//MARK: - table method
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.arrayFruit.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell:simpleTableViewCell? = tableView.dequeueReusableCell(withIdentifier:"simpleTableViewCell") as? simpleTableViewCell
if cell == nil{
tableView.register(UINib.init(nibName: "simpleTableViewCell", bundle: nil), forCellReuseIdentifier: "simpleTableViewCell")
let arrNib:Array = Bundle.main.loadNibNamed("simpleTableViewCell",owner: self, options: nil)!
cell = arrNib.first as? simpleTableViewCell
}
cell?.labelName.text = self.arrayFruit[indexPath.row]
cell?.imageViewFruit.image = UIImage (named: "fruit_img")
return cell!
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 100.0
}
100%問題なく動作しています(テスト済み)