Ios swift 3.0中使用的块未调用Denit
我在单元格中使用了块来获取开关值,但现在我的问题是在我使用块的地方没有调用Denit。它以前完全工作,但在swift 3.0中不工作 我的开关单元: 这个细胞的用途Ios swift 3.0中使用的块未调用Denit,ios,swift,deinit,Ios,Swift,Deinit,我在单元格中使用了块来获取开关值,但现在我的问题是在我使用块的地方没有调用Denit。它以前完全工作,但在swift 3.0中不工作 我的开关单元: 这个细胞的用途 另外,如果我对这两个块进行注释,则将调用我的deinit。听起来您是在通过在块内强烈引用视图控制器来创建保留循环。相反,您应该创建一个要使用的vc的弱引用。这是我喜欢的方法 cell?.blockBtn_Clicked = { [weak self] print("button clicked") self?.vie
另外,如果我对这两个块进行注释,则将调用我的deinit。听起来您是在通过在块内强烈引用视图控制器来创建保留循环。相反,您应该创建一个要使用的vc的弱引用。这是我喜欢的方法
cell?.blockBtn_Clicked = { [weak self]
print("button clicked")
self?.viewModel.//do something
}
cell?.blockSwitch_Change = { [weak self] (isOn) in
print("switch value changed \(isOn)")
self?.viewModel.//do something
}
[weake self]部分将把self的弱引用传递到块中,不过请注意,该引用现在是可选的。然后,您可以使用可选的链接或在此之后将其展开。尝试将它们都设置为
弱
引用。这些打印语句是否总是位于块内,而您在看到问题时实际使用的代码?@AidanMalone否我无法共享实际代码这就是我临时打印的原因statement@RakeshaShastri它是可以提供代码吗?好的,块内的代码是否引用单元格本身?作为替代,您也可以使用[unowned self]。这也将创建一个弱引用,但它不是可选的(它将在传递到块之前隐式展开)。如果您的应用程序通常比较安全,因为它可以防止潜在的崩溃,但值得考虑的是,在调用此块且视图控制器已从内存中删除的情况下,您可能不希望应用程序继续执行。
let cell = tableView.dequeueReusableCell(withIdentifier: CellSwitch.identifier) as? CellSwitch
cell?.lblTitle.textColor = Color.custom(hexString: objModel.titleLblColor, alpha: 1.0).value
cell?.lblTitle.text = objModel.strTitle
cell?.objSwitch.isOn = objModel.isOn
cell?.btnInfo.isHidden = !objModel.isInfoBtn
cell?.blockBtn_Clicked = {
print("button clicked")
}
cell?.blockSwitch_Change = { (isOn) in
print("switch value changed \(isOn)")
}
if objModel.isEnable == false
{
cell?.isUserInteractionEnabled = false
cell?.contentView.alpha = 0.5
}
else
{
cell?.isUserInteractionEnabled = true
cell?.contentView.alpha = 1.0
}
return cell!
cell?.blockBtn_Clicked = { [weak self]
print("button clicked")
self?.viewModel.//do something
}
cell?.blockSwitch_Change = { [weak self] (isOn) in
print("switch value changed \(isOn)")
self?.viewModel.//do something
}