willDisplayCell delegate method Swift
Asked Answered
E

2

9

I've been working around the tableview and got stuck on the following issue.

As far as i understand the willDisplayCell delegate method should allow me to access the current cell design.
My issue is - i cannot access the instance of the custom cell, because it was separately declared in the cellForRowAtIndexPath method. And if i declare it again - i cannot access it's objects (i have an uibutton there). Or maybe i'm misunderstanding the use of this method.

Here is my code

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

//declaring the cell variable again

    var cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TblCell

    if let text = cell.lblCarName.text where !text.isEmpty {
        cell.act1.hidden = false
    } else {
        println("Failed")
    }
}

My goal as it is seen in the code is to access the TblCell uilabel and apply a conditional to it - if its nil - show the uibutton.

NB: My delegate and datasource is set correctly, the method is running, the app compiles, but the conditionals don't work as i've intended them to.

Thank you!

Expansive answered 31/8, 2015 at 8:24 Comment(1)
I'm wondering though, why can't you do this in cellForRowAtIndexPath?Mada
D
8

This delegate give you the instance of the cell which will now be shown and that particular cell is actually sent in as the cell parameter. Typecast it and use the conditional.

Try this code instead.

var cell:TblCell = cell as! TblCell

if let text = cell.lblCarName.text where !text.isEmpty {
    cell.act1.hidden = false
} else {
    println("Failed")
}
Decoupage answered 31/8, 2015 at 8:26 Comment(7)
Thank you, thats a very good idea. Tried it, but as the result uibutton becomes visible on every cell, except the last one - where the uilabel text is actually nil. Is it how it should work? Because i was expecting the opposite result (Expansive
if you just want to hide the cell.act1, you can just do that in cellForRowAtIndexPath, shouldn't you?Decoupage
tried applying the same conditional in cellForRowAtIndexPath. gives me the same result - uibutton is visible on all cells, except the last one.Expansive
and you want UIButton only to be visible if cell.lblCarName.text is not empty, right?Decoupage
otherwise, i want it to be visible when cell is cell.lblCarName.text is emptyExpansive
i understood the mistake) very obvious) it's quest the !text.IsEmpty criteria. Thank youExpansive
try using if cell.lblCarName.text.isEmpty { cell.act1.hidden.false } else { cell.act1.hidden = true }Decoupage
L
4

I think a better way would be:

guard let cell = cell as? TblCell else { return }

inside the willDisplayCell

Levee answered 30/12, 2018 at 5:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.