[英]How do I redeclare a property as read-write in UIResponder subclass with swift?
[英]How to override readonly property in Swift subclass, make it read-write, and assign to superclass?
如何從子類中覆蓋 Swift 超類的只讀屬性以使該屬性可讀寫?
我想這樣做,因為 iOS UIResponder
文檔說這是必需的。 但是,當我嘗試實現我認為 Swift 5 文檔所說的可以完成的事情時,我遇到了一個錯誤:
基於前面提到的 Swift 文檔聲明,我沒有找到相應的示例,我創建了以下子類,XCode 在該子類中生成此錯誤消息:
"無法分配給屬性:'inputAccessoryViewController' 是一個只能獲取的屬性"
class InputAccessoryEnabledTextView : UITextView { override var inputAccessoryViewController: UIInputViewController? { get { super.inputAccessoryViewController } set { super.inputAccessoryViewController = newValue } } }
宣言
var inputAccessoryViewController: UIInputViewController? { 得到 }
討論
此屬性通常用於將附件視圖控制器附加到系統提供的為 UITextField 和 UITextView 對象呈現的鍵盤。 此只讀屬性的值為 nil。 如果要將自定義控件附加到系統提供的輸入視圖控制器(例如系統鍵盤)或自定義輸入視圖(您在 inputViewController 屬性中提供的),請在 UIResponder 子類中將此屬性重新聲明為可讀寫。 然后,您可以使用此屬性來管理自定義附件視圖。 當接收者成為第一響應者時,響應者基礎結構在顯示之前將附件視圖附加到適當的輸入視圖。
super.inputAccessoryViewController
不可設置。 您在子類self.inputAccessoryViewController
中的重寫實現是.
通過向子類中的屬性添加 setter,您不會自動在超類中添加相同的東西。 子類中的內容保留在子類中。
所以並不是你不能通過添加一個setter來覆蓋一個屬性,你只是不能在這里設置它:
override var inputAccessoryViewController: UIInputViewController? {
get { super.inputAccessoryViewController }
set { super.inputAccessoryViewController = newValue }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
你可以做其他事情,比如:
override var inputAccessoryViewController: UIInputViewController? {
get { super.inputAccessoryViewController }
set { print("I just go set to \(newValue)") }
}
但這不是很有用。 你想要的可能是:
private var myInputAccessoryController: UIInputViewController?
override var inputAccessoryViewController: UIInputViewController? {
get { myInputAccessoryController }
set { myInputAccessoryController = newValue }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.