2016-03-30 12 views
2

Ich bin ein Neuling in Swift, und ich versuche, benutzerdefinierte UITableViewCell, sehe ich viele Tutorial in Youtube und Internet. Aber ich kann es nicht, ich habe versucht, viel zu reparieren, aber nichts ist Veränderung. hier ist mein Code:Wie man benutzerdefinierte UITableViewCell in Swift

class movieViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 

var categories = ["Action", "Drama", "Science Fiction", "Kids", "Horror"] 


@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var btnMenu: UIBarButtonItem! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    btnMenu.target = self.revealViewController() 
    btnMenu.action = Selector("revealToggle:") 

    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 
    self.revealViewController().rearViewRevealWidth = 200 
    self.tableView.registerClass(CategoryRow.self, forCellReuseIdentifier: "Cell") 

    // Do any additional setup after loading the view. 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return categories[section] 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return categories.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CategoryRow 
    cell.labelA.text = self.categories[indexPath.row] 
    cell.labelB.text = self.categories[indexPath.row] 

    return cell 
} 

CategoryRow.swift:

class CategoryRow: UITableViewCell { 
    var labelA: UILabel! 
    var labelB: UILabel! 

    override func awakeFromNib() { 

     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

} 

und mein Fehler:

enter image description here

+0

Wo erstellen Sie 'labelA' und' labelB' – Abizern

Antwort

3

Es scheint, dass Sie Xib nicht haben. Und du deklarierst einfach dein Label, aber du initiierst es nicht. Also labelA und labelB wird Null. es macht einen Crash.

Wenn Sie nicht xib wollen, müssen Sie zwei Funktion in CategoryRow wie Code unten implementieren:

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

} 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    self.labelA = UILabel(frame: CGRectMake(0,0, self.contentView.frame.size.width, self.contentView.frame.size.height)) 
//Same here for labelB 
    self.contentView.addSubview(labelA) 
} 

Eine andere Möglichkeit ist, dass Sie xib UITableCiewCell mit dem Namen derselben mit Ihrer Klasse erstellen. Und setze diese Zelle zu deiner Klasse. Sie entwerfen labelA und labelB in diesem xib und drage Steckdose in Klasse. Und ändern Sie in viewDidLoad

self.tableView.registerNib(UINib(nibName: "nameYourxib"), forCellReuseIdentifier: "Cell") 
+0

OMG du rettest mich, und wie wäre es, wenn ich .xib habe? –

+0

@EvanNgo Überprüfen Sie meine Antwort bearbeiten. –

+1

bist du vietnamesisch? –

1

Sie nicht die LabelA oder labelB zuweisen haben. Deshalb zeigen Sie den Fehler. Schließen Sie Ihr Etikett mit Ihnen diese Ui: enter image description here

-3

Sie müssen Delegaten hinzuzufügen eine Datenquelle in viewDidLoad

viewDidLoad() { 
    self.tableView.delegate = self 
    self.tableView.datasource = self 
} 

und Sie müssen die LabelA und labelB durch Auslässe nicht Variablen erstellen. Halten Sie die Steuerung und ziehen Sie vom Storyboard in die entsprechende Datei und loslassen, wählen Sie outlet und geben Sie den Namen labelA und labelB

+0

Wenn Delegate nicht festgelegt wurde, würden die Delegate-Methoden nicht aufgerufen werden. Das Überschreiben der 'viewDidLoad' Methode und nicht das Aufrufen von' super.viewDidLoad() 'würde Sie von Fehlern gebissen bekommen. Der Etikettenteil ist korrekt. – redent84

0

@vien vu Antwort richtig ist aber, was ohne XIB zu tun ?? Here ist die komplette Lösung für benutzerdefinierte Zelle in Swift

Verwandte Themen