拆分视图控制器 - 自定义 UITableViewCell
Split View Controller - Custom UITableViewCell
我正在尝试将自定义 UITableViewCell 添加到我的 Split View Controller Master。当我 运行 我的应用程序时,单元格不会出现,尽管它们确实带有 println 语句确认的信息。经过一些研究,我发现只生成标准 UITableViewCells。
TableViewController 具有通过 Storyboard 连接的数据源和代理,UITableViewCell 具有带有标识符的自定义 Class。
TableView 和 TableViewCell 在同一个 ViewController.
TableViewCell 可重用标识符是 "ArtistCell",class 是 ArtistCell。
import UIKit
import MediaPlayer
class ArtistsMasterTableViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource {
var artistsQuery:MPMediaQuery!
var artists:NSArray!
var artistAlbums:NSArray!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
artistsQuery = MPMediaQuery.artistsQuery()
artists = artistsQuery.collections
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return artists.count
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println(artists[indexPath.row].items)
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ArtistCell", forIndexPath: indexPath) as! ArtistCell
cell.backgroundColor = UIColor.clearColor()
var rowItem:MPMediaItem = artists.objectAtIndex(indexPath.row).representativeItem
if let artwork = rowItem.valueForProperty(MPMediaItemPropertyArtwork) as? MPMediaItemArtwork {
cell.artistImage!.image = artwork.imageWithSize(cell.artistImage.bounds.size)
}
cell.artistNameLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
// artistCell.albumsLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
// artistCell.songsLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
return cell
}
自定义单元格:
class ArtistCell: UITableViewCell {
@IBOutlet weak var artistImage: UIImageView!
@IBOutlet weak var artistNameLabel: UILabel!
@IBOutlet weak var albumsLabel: UILabel!
@IBOutlet weak var songsLabel: UILabel!
}
以下是部分故事板截图:
好问题。据我所见,实现此方法的方法是创建一个自定义的 xib 文件,您将其出队。这是 objective-c 中关于该主题的最佳文章:https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722
基本上,您执行以下操作:
- 设置你的 table 就像你减去可重复使用的细胞
- 创建一个自定义 xib 文件并使其看起来像您的原型单元格(您可以通过制作一个空对象并将 tableviewcell 拖到故事板中来简单地做到这一点
- 确保在 Identity Inspector 中将 xib 的 class 类型设置为 ArtistCell
- 创建自定义 class ArtistCell 以将 xib 连接到
在设置 cellForRowAtIndexPath 时使用此代码
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cell") as? ArtistCell
if cell == nil{
tableView .registerNib(UINib(nibName: "ArtistCell", bundle: nil), forCellReuseIdentifier: "cell")
cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? ArtistCell
}
cell?.nameLabel.text = "Hello World"
return cell!
}
为了以防万一,这里有一个屏幕截图:
此代码已经过全面测试,适用于我。供参考。 :-) 希望这对您有所帮助!
干杯!
罗伯·诺巴克
我正在尝试将自定义 UITableViewCell 添加到我的 Split View Controller Master。当我 运行 我的应用程序时,单元格不会出现,尽管它们确实带有 println 语句确认的信息。经过一些研究,我发现只生成标准 UITableViewCells。
TableViewController 具有通过 Storyboard 连接的数据源和代理,UITableViewCell 具有带有标识符的自定义 Class。
TableView 和 TableViewCell 在同一个 ViewController.
TableViewCell 可重用标识符是 "ArtistCell",class 是 ArtistCell。
import UIKit
import MediaPlayer
class ArtistsMasterTableViewController: UITableViewController, UITableViewDelegate, UITableViewDataSource {
var artistsQuery:MPMediaQuery!
var artists:NSArray!
var artistAlbums:NSArray!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
artistsQuery = MPMediaQuery.artistsQuery()
artists = artistsQuery.collections
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return artists.count
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println(artists[indexPath.row].items)
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ArtistCell", forIndexPath: indexPath) as! ArtistCell
cell.backgroundColor = UIColor.clearColor()
var rowItem:MPMediaItem = artists.objectAtIndex(indexPath.row).representativeItem
if let artwork = rowItem.valueForProperty(MPMediaItemPropertyArtwork) as? MPMediaItemArtwork {
cell.artistImage!.image = artwork.imageWithSize(cell.artistImage.bounds.size)
}
cell.artistNameLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
// artistCell.albumsLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
// artistCell.songsLabel.text = rowItem.valueForProperty(MPMediaItemPropertyArtist) as? String
return cell
}
自定义单元格:
class ArtistCell: UITableViewCell {
@IBOutlet weak var artistImage: UIImageView!
@IBOutlet weak var artistNameLabel: UILabel!
@IBOutlet weak var albumsLabel: UILabel!
@IBOutlet weak var songsLabel: UILabel!
}
以下是部分故事板截图:
好问题。据我所见,实现此方法的方法是创建一个自定义的 xib 文件,您将其出队。这是 objective-c 中关于该主题的最佳文章:https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722
基本上,您执行以下操作:
- 设置你的 table 就像你减去可重复使用的细胞
- 创建一个自定义 xib 文件并使其看起来像您的原型单元格(您可以通过制作一个空对象并将 tableviewcell 拖到故事板中来简单地做到这一点
- 确保在 Identity Inspector 中将 xib 的 class 类型设置为 ArtistCell
- 创建自定义 class ArtistCell 以将 xib 连接到
在设置 cellForRowAtIndexPath 时使用此代码
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cell") as? ArtistCell if cell == nil{ tableView .registerNib(UINib(nibName: "ArtistCell", bundle: nil), forCellReuseIdentifier: "cell") cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? ArtistCell } cell?.nameLabel.text = "Hello World" return cell! }
为了以防万一,这里有一个屏幕截图:
此代码已经过全面测试,适用于我。供参考。 :-) 希望这对您有所帮助!
干杯!
罗伯·诺巴克