请考虑以下代码。一切都是由本书完成的,除了为委托分配了除self之外的其他一些类的实例。然而,这段代码失败了 - 委托从未被调用过。那是为什么?
class My: UITextField {
...
init(...) {
delegate = MyDelegate()
}
}
public class MyDelegate: NSObject, UITextFieldDelegate {
public func textFieldDidBeginEditing(_ textField: UITextField) {
print("MyDelegate was called")
}
}
答案 0 :(得分:1)
如果使用weak
var定义了委托属性,则不会保留MyDelegate
实例。如果没有强大的参考,它将很快被取消分配,不再存在接听电话。
您的示例代码偏离了典型的委托模式:
代表团和Cocoa框架
文本字段的视图控制器通常会将自己指定为文本字段的委托:
class MyViewController: UITextFieldDelegate {
...
func viewDidLoad() {
myTextField.delegate = self
}
func textFieldDidBeginEditing(_ textField: UITextField) {
print("textFieldDidBeginEditing")
}
}
答案 1 :(得分:0)
didLoad不是UITextField的函数,因此你的委托没有真正设置,这就是为什么它没有被调用。如果以编程方式创建My类,则可以在创建实例后设置委托。
let myTextField = My()
mytextField.delegate = MyDelegate()
如果要在每次创建类时设置委托,则需要覆盖UITextField的init函数并在init函数中创建委托。
class MyTF : UITextField
{
override init(frame: CGRect)
{
super.init(frame: frame)
delegate = MyDelegate()
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
delegate = MyDelegate()
}
}
答案 2 :(得分:0)
您可以通过首先使用“let”创建对委托类的强引用,然后设置委托来实现此目的。否则,因为委托引用很弱,它将具有零引用计数和nil out,使您没有委托。
import urllib, csv, requests, os
from pathlib import Path
spreadsheetAddress = 'C:\\SOURCE\\CSV\\FILE.csv'
targetDirectory = 'C:\\TARGET\\IMAGE\\SAVE\\LOCATION\\'
def getSpreadsheetContents(spreadsheetAddress):
with open(spreadsheetAddress) as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
imageSet = {}
for row in readCSV:
if 'image_id' not in row:
imageSet[row[0]] = row[1]
return imageSet
if __name__ == "__main__":
if os.path.exists(spreadsheetAddress) and os.path.exists(targetDirectory):
imageDict = getSpreadsheetContents(spreadsheetAddress)
for key, value in imageDict.items():
if requests.get(value).status_code == 200:
filename, file_extension = os.path.splitext(value)
address = str(targetDirectory + "\\" + key + file_extension)
urllib.request.urlretrieve(value, address)
else:
raise Exception("File not found")