我正在尝试声明我的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
}
答案 0 :(得分:1)
您无法声明cell
类型的变量UITableViewCell
,然后将其用作FriendCell
。
删除第3行中的var cell = ...
并在第6行的开头添加let
,以使cell
成为本地变量。
此外,您的变量名称令人困惑,这会使事情变得不必要。我们没有理由拥有两个变量cell
和friendCell
。 friendCell
应该只被称为friend
。 resultCell
也是如此。
答案 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