使用参数初始化自定义UITableViewCell

时间:2016-06-03 07:13:20

标签: xcode swift uitableview initialization

我正在尝试创建一个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中使用初始化器,我应该把它作为参数?

2 个答案:

答案 0 :(得分:1)

我不知道audioFilemediaType属性是否定义错误。它们应该没有错误。如果使用.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

不要使用大写的第一个字母(TitleFile等命名函数参数。这可能与类型混淆。相反,请使用titlefile等。再次,有很多例子。

尝试解决此问题。这个可能帮助。