我已经使此代码完美地工作了,但仍然可以,但是我似乎看到了一条警告消息:
实例将被立即释放,因为属性“ selectButton”为 弱
这只是将按钮图像更改为不同的大小,具体取决于它是iPad还是iPhone,由于屏幕大小,我试图更改为:
@IBOutlet var selectButton : UIButton?
然后将其添加到ViewDidLoad()中作为自定义按钮:
selectButton = UIButton(type: .custom)
但是当应用编译时,图像看起来也不会像使用过的那样。
我到处都在寻找解决方法,但似乎找不到它,对此有什么帮助吗?
我在下面添加了我的代码:
@IBOutlet weak var selectButton = UIButton(type: .custom)
var bluBtnIphn : String = "blue_iPhone_btn.png"
var orgBtnIphn : String = "org_iPhone_btn.png"
switch UIDevice.current.userInterfaceIdiom {
case .phone:
print(tag,"iPhone Used")
selectButton?.setImage(UIImage(named: bluBtnIphn), for: .normal)
selectButton?.setImage(UIImage(named: orgBtnIphn), for: .highlighted)
case .pad:
print(tag,"iPad Used")
selectButton?.setImage(UIImage(named: bluBtnIpad), for: .normal)
selectButton?.setImage(UIImage(named: orgBtnIpad), for: .highlighted)
case .unspecified:
print("Unknown device..")
default:
break
}
答案 0 :(得分:4)
当不再有strong
个引用时,对象将被释放。
在您的情况下,您的视图控制器仅具有weak
对按钮的引用。
并且因为您正在代码中实例化它。那是唯一的引用。
之所以感到困惑,是因为您与在笔尖/故事板上创建的按钮和在代码中创建的按钮混为一谈。
当您从笔尖或情节提要中创建按钮时,它看起来像这样...
@IBOutlet weak var someButton: UIButton!
@IBOutlet
告诉Xcode这是一个Interface Builder连接的对象weak var
在视图控制器中很弱,因为情节提要将其添加到视图中,然后视图获得了对其的强大引用。在您的情况下,情节提要不是在创建它,因此请将其更改为...。
var selectButton = UIButton(type: .custom)
这将成为强大的参考,并阻止其取消分配。
编辑:在您发表最新评论后...
如果通过Interface Builder进行操作,则不要在代码中创建按钮。
如果您在Interface Builder中进行操作,则您的代码应为...
@IBOutlet weak var someButton: UIButton!
答案 1 :(得分:2)
1-您正在创建按钮的出口,因为它总是引用类型较弱,因为使用该按钮时,您需要检查它是否为零。您无法创建像@IBOutlet一样的弱var selectButton = UIButton(type:.custom)。
2-当您直接将图像设置为按钮时,键入name会通过自动智能显示图像,而无需像UIImage那样设置图像(名称为bluBtnIphn),因为您正在创建变量并浪费了内存。
3-将图像设置为按钮写入功能,并从viewDidLoad()或viewWillAppear()调用。
@IBOutlet weak var selectButton: UIButton!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
setImageToButton()
}
func setImageToButton() {
switch UIDevice.current.userInterfaceIdiom {
case .phone:
print(tag,"iPhone Used")
selectButton?.setImage(bluBtnIphn, for: .normal)
selectButton?.setImage(orgBtnIphn, for: .highlighted)
case .pad:
print(tag,"iPad Used")
selectButton?.setImage(bluBtnIpad, for: .normal)
selectButton?.setImage(orgBtnIpad, for: .highlighted)
case .unspecified:
print("Unknown device..")
default:
break
}
}
答案 2 :(得分:1)
为什么使用@IBOutlet?您正在手动分配按钮,然后说明为什么使用@IBOutlet。
@IBOutlet weak var selectButton = UIButton(type: .custom) // this is wrong
上述用法将发出警告,因为没有对已分配按钮对象的强烈引用,因此在ARC中,它将在分配后取消分配,因此selectButton将为nil。
使用以下方式进行手动按钮分配
var selectButton = UIButton(type: .custom)