2016-06-03 2 views
3

Я пытаюсь создать массив UITableViewCells, и до того, как я добавлю ячейки, мне нужно инициализировать их параметрами. Когда я пытаюсь инициализировать ячейку, я получаю сообщение об ошибке, что два свойства в классе никогда не были определены. Но после того, как я определил их, я получаю сообщение об ошибке, которое использовались перед инициализацией. Вот классИнициализация пользовательского UITableViewCell с параметрами

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 
} 

И это где Im пытается инициализировать, а затем добавить значение к нему с помощью метода конфигурирования ячейки:

let newSongCell = SimpleCellClassTableViewCell.init(style: .Default, reuseIdentifier: "SimpleCell") 

     newSongCell.configureCell(Title: setTitle, 
            File: setAudioFile, 
            Type: setMediaType, 
           Artist: setArtist, 
            Image: setImage, 
           Sender: setSender, 
            ID: setId) 

Параметров для файла и типа являются те, метанием той же ошибки , Также, если мне нужно использовать инициализатор с NSCoder, что я должен поставить в качестве аргумента?

+0

var носитель информацииType: songType! = nil // Проверьте эту строку кода .. измените на var mediaType: songType? = nil – Bharath

ответ

1

Я не вижу, если свойства audioFile и mediaType определены неправильно. Не должно быть ошибок с ними. Если вы используете файл .xib - обычно вы не должны использовать явный инициализатор. И, конечно же, вы не должны этого делать в своем случае, потому что пытаетесь использовать розетки. Когда вы используете init(style:reuseIdentifier:), вы пропустите свой .xib-файл и весь пользовательский интерфейс. Предположим, что .xib filename SimpleCellClassTableViewCell.xib, пользовательский класс для UITableViewCell в Identity Inspector установлен в SimpleCellClassTableViewCell, идентификатор повторного использования установлен на «SimpleCell». Я предлагаю вам использовать этот код для инициализации вашей ячейки:

guard let newSongCell = UINib(nibName: "SimpleCellClassTableViewCell", bundle: nil).instantiateWithOwner(nil, options: nil).first as? SimpleCellClassTableViewCell 
else 
{ 
    fatalError("Error loading SimpleCellClassTableViewCell") 
} 

Обычно вы не должны использовать инициализатор с NSCoder явно. Этот инициализатор используется раскадровкой или .nib-файлом.

Наконец, если вы используете выходы из раскадровки - тогда вы не должны пытаться получить экземпляр ячейки любым инициализатором. Вы должны использовать метод UITableViewdequeueReusableCellWithIdentifier(forIndexPath:).

Это все о вашем прямом вопросе, , но на самом деле вам редко нужно инициализировать UITableViewCell самостоятельно. Если вы это сделаете, возможно, вы сделаете что-то не так. Предположим снова, что вы используете .xib файл, то в большинстве случаев вы просто зарегистрировать свой файл в viewDidLoad вашей таблицы контроллера представления

tableView.registerNib(UINib(nibName: "SimpleCellClassTableViewCell", bundle: nil), forCellReuseIdentifier: "SimpleCell") 

, а затем ваш tableView будет инициализировать или использовать SimpleCellClassTableViewCell экземпляры для вас dequeueReusableCellWithIdentifier(forIndexPath:) методом

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 и т. Д. Опять же, есть много примеров.

Постарайтесь устранить эти проблемы. Это могло бы помочь.

Смежные вопросы