2016-06-03 9 views
3

Ich versuche, ein Array von UITableViewCells zu erstellen, und bevor ich die Zellen anfügen, muss ich sie mit Parametern initialisieren. Wenn ich versuche, die Zelle zu initialisieren, bekomme ich einen Fehler, dass die zwei Eigenschaften in der Klasse nie definiert wurden. Aber nachdem ich sie definiert habe, bekomme ich einen Fehler, dass die Variablen verwendet wurden, bevor sie initialisiert wurden. Hier ist die KlasseInitialisieren von benutzerdefinierten UITableViewCell mit Parametern

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 
} 

Und das ist, wo Im initialisieren und fügen Sie dann Werte, um es mit configure Zelle Methode versuchen:

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

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

Die Parameter für Datei- und Typ sind diejenigen, die gleichen Fehler zu werfen . Auch wenn ich den Initialisierer mit NSCoder verwenden soll, was soll ich als Argument angeben?

+0

var mediaType: songType! = null // Überprüfen Sie diese Codezeile. Ändern Sie zu var mediaType: songType? = Null – Bharath

Antwort

1

Ich sehe nicht, ob audioFile und mediaType Eigenschaften falsch definiert sind. Es sollte keinen Fehler mit ihnen geben. Wenn Sie die .xib-Datei verwenden, sollten Sie normalerweise keinen expliziten Initialisierer verwenden. Und Sie müssen dies in Ihrem Fall natürlich nicht tun, weil Sie versuchen, Verkaufsstellen zu nutzen. Wenn Sie init(style:reuseIdentifier:) verwenden, vermissen Sie Ihre .xib-Datei und die gesamte Benutzeroberfläche. Nehmen wir an, dass .xib filename SimpleCellClassTableViewCell.xib ist, Benutzerdefinierte Klasse für UITableViewCell in Identity Inspector ist auf SimpleCellClassTableViewCell festgelegt, Wiederverwendung Bezeichner ist auf "SimpleCell" festgelegt. Ich biete Ihnen diesen Code verwenden, um Ihr Handy zu initialisieren:

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

Normalerweise sollten Sie nicht initializer mit NSCoder explizit verwenden. Dieser Initializer wird von Storyboard- oder NIB-Dateien verwendet.

Endlich, wenn Sie Outlets von Storyboard verwenden - dann sollten Sie nicht versuchen, Zelle Instanz von jedem Initialisierer überhaupt zu bekommen. Sie sollten UITableView 's dequeueReusableCellWithIdentifier(forIndexPath:) Methode verwenden.

Das war alles über Ihre direkte Frage, aber in der Tat müssen Sie selten UITableViewCell selbst initialisieren. Wenn Sie das tun, tun Sie wahrscheinlich etwas falsch. Nehmen wir noch einmal, dass Sie .xib Datei, dann in den meisten Fällen verwenden Sie einfach registrieren Sie Ihre Datei in viewDidLoad Ihrer Tabelle View-Controller

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

und dann tableView wird initialisiert oder SimpleCellClassTableViewCell Instanzen für Sie Wiederverwendung von dequeueReusableCellWithIdentifier(forIndexPath:) Methode

1

Es gibt einige Probleme mit Ihrem Code. Ich schlage vor, Sie einige Beispiele zu sehen, wo UITableView. Apple Docs oder Github sind gute Quellen dafür.

Ausgabe # 1

Sie müssen nicht außer Kraft setzen bezeichnet `UITableViewCell des initializers (unten), weil Sie in der Überschreibung nichts zu tun.

public init(style: UITableViewCellStyle, reuseIdentifier: String?) 
public init?(coder aDecoder: NSCoder) 

Issue # 2

Ihr Code tut nicht das Zellobjekt wiederverwenden, die schlecht ist.

Ausgabe # 3

In Swift init nicht auf den Anruf Ort verwendet wird, so Initialisierungscode Ihrer Zelle sein (auch unter Berücksichtigung # 2 Ausgabe) sollten

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! 

Issue # 4

Benennen Sie keine Funktionsparameter mit Großbuchstaben (Title, File, usw.) . Dies könnte mit einem Typ verwechselt werden. Verwenden Sie stattdessen title, file, etc .. Auch hier gibt es viele Beispiele.

Versuchen Sie, dieses Problem zu beheben. Diese könnte helfen.