2016-12-06 82 views
0

例如,我具有符合一個UITextFieldDelegate協議,並從該協議繼承的方法的視圖控制器..,委託對象如何知道調用委託對象上的WHICH方法?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
        replacementString string: String) -> Bool { 
     // do some stuff... 
     return true 
    } 

在main.storyboard文件,我控制拖着TextField對這個視圖控制器,並點擊'委託'讓項目知道我的視圖控制器現在是這個文本字段的代表。

現在...我知道這個視圖控制器現在在我的UITextField中稱爲「委託」屬性,但在我的視圖控制器中,我有多個方法和屬性在我的文本字段。

如何知道文本字段作爲textField(_:shouldChangeCharactersIn:replacementString)函數中的第一個參數傳入?與任何其他隨機無關的功能相反?

由於

加成相關的問題 在我的視圖控制器(所述的UITextField的代表),有一個@IBAction目標函數,其源是相同的文本字段輸入對象。現在...我在該IBAction函數中具有功能,基本上可以在屏幕上輸入輸入值的輸入UPON編輯內容。

但是,使用這個新的委託函數,我實現了一些功能,如果有兩個相同的字符,則不會更改輸入的值。當我運行我的應用程序時,我可以看到,因爲委託功能正在工作,當兩個相同的數字在文本字段中時,該值不會在文本字段中更新,因此,@IBAction函數甚至不會被調用(或者至少沒有任何東西印在控制檯上)。

這表明,對我來說,委託函數優先於@IBAction函數。

只需尋找關於該觀察的真實或錯誤答案。謝謝!

+0

你的文本字段將調用它必須調用的委託方法(所以它可以是所有這些方法)。每種方法都有不同的目的。如果你只需要使用'textField(_:shouldChangeCharactersIn:replacementString)',那麼你只能實現這個委託方法。 – Randy

+0

如果你想開始實施蘋果的東西(iOS,MacOS,tvOS等),你必須學習更多關於[委託](https://developer.apple.com/library/content/documentation/General/ Conceptual/DevPedia-CocoaCore/Delegation.html),因爲它是這些技術中使用的基本模板 – Randy

回答

1

裏面UITextField將代碼等同於:

self.delegate?.textfield(self, shouldChangeCharactersIn: rangeThatChanged, replacementString: stringThatChanged) 

所以,文本字段代碼調用它代表的特定功能,傳遞所需的參數,包括對自身的引用。這與在對象引用上調用任何函數沒有什麼不同。

對於您的'獎金問題',代表功能的名稱是應該 ChangeCharactersIn。此函數通過返回true或false來指示更改是否發生。如果它返回false,則更改將被丟棄。如果沒有改變,則變化動作不被調用。

+0

優秀的答案謝謝。還有一個跟進問題 - 爲什麼使用將對象設置爲另一個對象的委託的過程,我們何時可以使用@IBActions?例如,我在IB看到,我可以選擇從文本字段到視圖控制器建立一個名爲「編輯開始」的IBAction。然後我可以創建一個自定義函數來執行xyz。但也有一個名爲「textFieldDidBeginEditing」的委託方法...這兩個不會做同樣的事情嗎?委託方法的唯一區別是由Apple編寫並具有預設功能? – user7024499

+0

所有'@ IBAction'函數都具有相同的簽名。基本上'functionName(sender:UIView) - > Void'一個IBAction不能接受任何其他參數並且不返回一個值。您將不得不問蘋果爲什麼代理和UITextField的操作之間存在重疊的功能;我個人懷疑設置一個'委託'屬性比添加多個動作處理器更簡單(並且仍然必須爲不能作爲動作處理器的事物設置委託) – Paulw11

+0

謝謝,我認爲這樣回答了這個問題。因此,爲什麼要使用委託而不是IBAction可能有兩個原因:(1)委託可以執行的一些方法不是每個說法的「操作」,它們更像是請求信息的方法。就像停止接受任何字符的輸入一樣,這不像測試值那麼簡單。 (2)當你開始添加多個動作處理程序時,使用IBActions會變得很沉重 – user7024499

1

documentation該方法規定:

文本字段調用此方法,每當用戶操作導致它的文本改變。

因此,當用戶操作導致的UITextField的文本改變,給出UITextField代碼檢查UITextField對象是否具有代表,而且,如果這樣做,該委託對象是否實現textField(_:shouldChangeCharactersIn: replacementString:)。如果是這樣,UITextField調用方法,傳遞UITextField對象作爲第一個參數。