Ios 正确设置委托后,委托发现无
在我的Ios 正确设置委托后,委托发现无,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,在我的StrechyHeaderLayout类中,我正在创建一个协议 protocol StrechyHeaderLayoutDelegate : class { func manipulateHeaderView(sender: StrechyHeaderLayout) } 在这个类中,我声明了一个委托 var delegate : StrechyHeaderLayoutDelegate? 我在我的ScheduleViewController类中使用
StrechyHeaderLayout
类中,我正在创建一个协议
protocol StrechyHeaderLayoutDelegate : class {
func manipulateHeaderView(sender: StrechyHeaderLayout)
}
在这个类中,我声明了一个委托
var delegate : StrechyHeaderLayoutDelegate?
我在我的ScheduleViewController
类中使用这个协议。
我正在创建一个变量StrechyHeaderLayoutObj
作为类全局变量
class ScheduleViewController: UICollectionViewController,StrechyHeaderLayoutDelegate {
let StrechyHeaderLayoutObj = StrechyHeaderLayout()
...
}
我正在viewDidLoad()中分配代理
正在设置代理,但当调用StrechyHeaderLayout
时,会发现代理nil
我正在尝试访问此方法中的委托
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
delegate!.manipulateHeaderView(self)
}
但这是一个错误:
致命错误:在展开可选值时意外发现nilLayoutAttributesForElementsRect可能在ViewdLoad之前被调用您的委托也可能是弱的
,以防止保留循环–您绝对不应该强制展开它。作为另一个挑剔的问题,尽量避免变量名以大写字母开头。这是为类名保留的。不,在LayoutAttributesForelementsRect@EricDlayoutAttributesForelementsRect之前调用viewDidLoad。在viewDidLoad之前可能会调用viewDidLoad。您的委托也应该是弱的,以防止保留循环–您绝对不应该强制展开它。作为另一个吹毛求疵,尽量避免变量名以大写字母开头。这是为类名保留的。否,viewDidLoad在layoutAttributesForElementsInRect@EricD之前调用
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
delegate!.manipulateHeaderView(self)
}