Downcast Instantiated UITableViewCell

时间:2015-12-03 04:49:10

标签: ios swift uitableview

我正在尝试声明我的UITableViewCell超出范围,如下所示,以便大幅减少此代码。

但是,以下实现会返回错误(有箭头的地方),大喊:

Value of type 'UITableViewCell' has no member 'friendButton'

我期待dequeueReusableCellWithIdentifier中的力量向下倾斜。

我希望将UITableViewCell删除范围,以便将所有configureCell方法和return语句排除在控制流之外。

let resultCell = userResults[indexPath.row]

var cell: UITableViewCell!

    if friends.contains({$0.parseObjectId == resultCell.parseObjectId}) {
        cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! FriendCell
------->cell.friendButton.tag = indexPath.row
------->cell.configureCell(resultCell)
        return cell
    } else if requestedFriends.contains({$0.parseObjectId == resultCell.parseObjectId}) {
        let cell = tableView.dequeueReusableCellWithIdentifier("RequestedFriendCell", forIndexPath: indexPath) as! RequestedFriendCell
        cell.friendButton.tag = indexPath.row
        cell.configureCell(resultCell)
        return cell
    } else if incomingFriendRequests.contains({$0.objectId == resultCell.parseObjectId}) {
        let cell = tableView.dequeueReusableCellWithIdentifier("AcceptFriendCell", forIndexPath: indexPath) as! AcceptFriendCell
        cell.friendButton.tag = indexPath.row
        cell.configureCell(resultCell)
        return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("AddFriendCell", forIndexPath: indexPath) as! AddFriendCell
        cell.friendButton.tag = indexPath.row
        cell.configureCell(resultCell)
        return cell
    }

5 个答案:

答案 0 :(得分:1)

您无法声明cell类型的变量UITableViewCell,然后将其用作FriendCell

删除第3行中的var cell = ...并在第6行的开头添加let,以使cell成为本地变量。

此外,您的变量名称令人困惑,这会使事情变得不必要。我们没有理由拥有两个变量cellfriendCellfriendCell应该只被称为friendresultCell也是如此。

答案 1 :(得分:1)

问题是var cell被定义为UITableViewCell类型。

即使您要对FriendCell进行出列/强制转换并对其进行分配,var cell本身仍为UITableViewCell类型( not {{ 1}})。

如果您仍希望将共享FriendCell变量保留在cell检查之外(并且只有一个返回语句,而不是很多),则必须使用上面@ZHZ建议的代码:

if

...配置特定于(cell as! FriendCell).friendButton.tag = indexPath.row 子类的属性。

编辑:另一种方法是在每个FriendCell块中定义特定于子类的变量,并为每个变量分配一个if语句。

答案 2 :(得分:1)

您需要键入将您的单元格转换为子单元格,否则父级将无法检测到子级特定的功能。这是OOP的主要概念。您必须明确地将类型转换为子类才能访问其函数。你应该做的是:

var cell: UITableViewCell!; 

if friends.contains({$0.parseObjectId == resultCell.parseObjectId}) {

var friendcell : FriendCell! = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! FriendCell
        let friendCell = friends[indexPath.row]
        friendcell.friendButton.tag = indexPath.row
        friendcell.configureCell(friendCell)
        cell = friendcell;
    } 

    ---------

    return cell;

答案 3 :(得分:1)

所有单元格子类共享friendButton属性和configureCell方法。

如果他们不共享超类,他们可能应该,让我们称之为超类GenericCell

您可以像这样声明cell

var cell: GenericCell!

GenericCell类应该实现configureCell并具有friendButton属性,然后您可以将单元格转换为GenericCell并调用这些方法而不会出现任何问题。

答案 4 :(得分:0)

这个怎么样

cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! UITableViewCell
let friendCell = friends[indexPath.row]
(cell as! FriendCell).friendButton.tag = indexPath.row