我正在尝试创建一个UITableViewCells数组,在我附加单元格之前,我需要用参数初始化它们。当我尝试初始化单元格时,我得到一个错误,即类中的两个属性从未定义过。但是在我定义它们之后,我得到一个错误,即在初始化之前使用了变量。这是班级
class SimpleCellClassTableViewCell: UITableViewCell {
@IBOutlet var artist: UILabel!
@IBOutlet var picture: UIImageView!
@IBOutlet var songTitle: UILabel!
@IBOutlet var sender: UILabel!
var audioFile: AnyObject? = nil
var mediaType: songType! = nil
var id: NSNumber! = nil
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func configureCell(Title title: NSString?,
File audioFile: AnyObject?,
Type mediaType: songType,
Artist artist: NSString?,
Image image: UIImage?,
Sender sender: NSString?,
ID id: NSNumber?) -> UITableViewCell {
self.audioFile = audioFile
self.mediaType = mediaType
if let newSender = sender{
self.sender.text = newSender as String
}
if let newTitle = title{
self.songTitle.text = newTitle as String
}
if let newImage = image {
self.picture.image = newImage
}
if let newArtist = artist {
self.artist.text = newArtist as String
}
if let newId = id {
self.id = newId as NSNumber
}
return self
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
这是我尝试初始化然后使用配置单元格方法向其添加值的地方:
let newSongCell = SimpleCellClassTableViewCell.init(style: .Default, reuseIdentifier: "SimpleCell")
newSongCell.configureCell(Title: setTitle,
File: setAudioFile,
Type: setMediaType,
Artist: setArtist,
Image: setImage,
Sender: setSender,
ID: setId)
File和Type的参数是抛出相同错误的参数。另外,如果我需要在NSCoder中使用初始化器,我应该把它作为参数?
答案 0 :(得分:1)
我不知道audioFile
和mediaType
属性是否定义错误。它们应该没有错误。如果使用.xib文件 - 通常不应使用显式初始化程序。并且肯定你不能在你的情况下这样做,因为你试图使用插座。当您使用init(style:reuseIdentifier:)
时,您会错过.xib文件和所有UI。假设.xib文件名是 SimpleCellClassTableViewCell.xib ,Identity Inspector中UITableViewCell的自定义类设置为SimpleCellClassTableViewCell
,重用标识符设置为“SimpleCell”。我建议您使用此代码初始化您的单元格:
guard let newSongCell = UINib(nibName: "SimpleCellClassTableViewCell", bundle: nil).instantiateWithOwner(nil, options: nil).first as? SimpleCellClassTableViewCell
else
{
fatalError("Error loading SimpleCellClassTableViewCell")
}
通常,您不应明确使用NSCoder初始化程序。这个初始化程序由storyboard或.nib文件使用。
最后,如果您使用故事板中的出口 - 那么您根本不应该尝试通过任何初始化程序获取单元格实例。您应该使用UITableView
的{{1}}方法。
这完全取决于您的直接问题,但实际上您很少需要自己初始化dequeueReusableCellWithIdentifier(forIndexPath:)
。如果你这样做,可能你做错了什么。再次假设您使用.xib文件,那么在大多数情况下,您只需在表视图控制器的UITableViewCell
中注册文件
viewDidLoad
然后您的tableView.registerNib(UINib(nibName: "SimpleCellClassTableViewCell", bundle: nil), forCellReuseIdentifier: "SimpleCell")
将通过tableView
方法为您初始化或重复使用SimpleCellClassTableViewCell
个实例
答案 1 :(得分:1)
您的代码存在一些问题。我建议你看一些UITableView
的例子。 Apple docs或github是这方面的好资源。
问题#1
您不需要覆盖指定的`UITableViewCell的初始值设定项(如下所示),因为您在覆盖中不执行任何操作。
public init(style: UITableViewCellStyle, reuseIdentifier: String?)
public init?(coder aDecoder: NSCoder)
问题#2
您的代码不重用错误的单元格对象。
问题#3
在Swift中init
未在呼叫站点上使用,因此您的小区的初始化代码(也考虑问题#2)应为
var simpleCell = tableView.dequeueReusableCellWithIdentifier("SimpleCell")
if simpleCell == nil {
let cell: SimpleCellClassTableViewCell = SimpleCellClassTableViewCell(style: .Default, reuseIdentifier: "SimpleCell")
cell.configureCell(Title: "test",
File: "",
Type: 2,
Artist: "test",
Image: UIImage(),
Sender: "test",
ID: 2)
simpleCell = cell
}
return simpleCell!
问题#4
不要使用大写的第一个字母(Title
,File
等命名函数参数。这可能与类型混淆。相反,请使用title
,file
等。再次,有很多例子。
尝试解决此问题。这个可能帮助。