這是一個相當複雜的繼承層次結構,所以請耐心等待(我試圖簡化一些事情,而不是說明我正在使用的確切情況,這更加複雜): -Objective-C - 子類代理子類
假設我創建了一個UITextField
的子類,名爲TextField
,這是我自己定製的增強型通用文本字段。現在,爲了提供這種增強的功能,在init
方法TextField
中,我設置了super.delegate = self
,使得來自UITextField
的所有代理方法都被髮送到TextField
。 TextField
實現UITextFieldDelegate
協議並接收這些委託方法來做一些有趣的事情。
但是,反過來,我想讓TextField
擁有自己的委託。因此,我創建了一個名爲TextFieldDelegate
的新協議(注意缺少UI
-prefix!),並給予TextField
帶有相應屬性的ivar id<TextFieldDelegate> __weak delegate
,以便其他類可以接收來自TextField
的委託方法。
我希望你仍然和我在一起,因爲到目前爲止我還沒有做過太複雜的事情。但是讓我們假設現在我創建了另一個自定義子類TextField
,我們稱之爲PasswordTextField
(在現實生活中,可能不需要創建子類來實現密碼功能,但假設有一些相當複雜的實現那需要這個)。
我們還假設我想使PasswordTextField
(如TextField
具有代理屬性)能夠發送一組增強的委託方法。例如,也許它可以發送一個方法passwordIsSecure
,一旦密碼達到所需的複雜程度就發送該方法。現在由於這種行爲在常規TextField
中找不到,我創建了一個新協議:PasswordTextFieldDelegate <TextFieldDelegate>
,它定義了PasswordTextField
和的新委託方法,它繼承了TextField
發送的所有委託方法。
問題是:如何在PasswordTextField
中執行此操作?不工作的事情:
繼承
我不能簡單地從TextField
繼承的委託,因爲TextField
的代表只聽TextFieldDelegate
而不是PasswordTextFieldDelegate
,所以我無法發送方法如[delegate passwordIsSecure]
因爲TextFieldDelegate
沒有這樣的方法。
重寫伊娃
我可以嘗試聲明中PasswordTextField
伊娃稱爲委託,但是編譯器會抱怨,這是一個重複的聲明,自然是因爲已經有所謂的代表在超伊娃,所以這不工作*。
修改超
我能回到TextField
類,並重新委託同時實現TextFieldDelegate
和PasswordTextFieldDelegate
,但這似乎凌亂,並告訴TextField
,它可以發送PasswordTextFieldDelegate
方法,其中當然,它不能!
我沒有試過這個,只是因爲它似乎打破了書中每一個明智的編碼規則。
總之,這樣做必須有一些方法,這樣一個類的子類可以擁有它自己的委託,它是超類委託的子委託,並且所有這些都可以很好地配合在一起,但是我可以不知道!有任何想法嗎?
(*作爲一個方面的問題,我不明白爲什麼編譯器會抱怨當PasswordTextField
聲明瞭一個「重複」伊娃命名的委託,但是當TextField
聲明伊娃命名委託這大概是的UITextField
重複不抱怨的財產叫代表!)
可能只是打在黑暗中..但不會有幫助,如果你只是重新聲明你的委託的@屬性爲ID,並有自己的綜合?我認爲它會奏效。 mebbe生病後試一試 –
govi
2012-01-13 14:02:48