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)
   }
但这是一个错误:
致命错误:在展开可选值时意外发现nil

LayoutAttributesForElementsRect可能在ViewdLoad之前被调用您的
委托也可能是
弱的
,以防止保留循环–您绝对不应该强制展开它。作为另一个挑剔的问题,尽量避免变量名以大写字母开头。这是为类名保留的。不,在LayoutAttributesForelementsRect@EricDlayoutAttributesForelementsRect之前调用viewDidLoad。在viewDidLoad之前可能会调用viewDidLoad。您的
委托也应该是
弱的
,以防止保留循环–您绝对不应该强制展开它。作为另一个吹毛求疵,尽量避免变量名以大写字母开头。这是为类名保留的。否,viewDidLoad在layoutAttributesForElementsInRect@EricD之前调用
   override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {    
           delegate!.manipulateHeaderView(self)
   }