不会调用非自我委托

时间:2016-08-07 22:36:44

标签: swift delegates uikit

请考虑以下代码。一切都是由本书完成的,除了为委托分配了除self之外的其他一些类的实例。然而,这段代码失败了 - 委托从未被调用过。那是为什么?

class My: UITextField {
  ...
  init(...) {
    delegate = MyDelegate()
  }
}

public class MyDelegate: NSObject, UITextFieldDelegate {
  public func textFieldDidBeginEditing(_ textField: UITextField) {
    print("MyDelegate was called")
  }
} 

3 个答案:

答案 0 :(得分:1)

如果使用weak var定义了委托属性,则不会保留MyDelegate实例。如果没有强大的参考,它将很快被取消分配,不再存在接听电话。

您的示例代码偏离了典型的委托模式:

  

代表团和Cocoa框架

     

The delegating object is typically a framework object, and the delegate is typically a custom controller object.

文本字段的视图控制器通常会将自己指定为文本字段的委托:

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")