Şu anda giriş ve kayıt formları ile bir iOS uygulaması geliştiriyorum. Klavyenin herhangi bir UITextField
s kapsamına girmediğinden emin olmak için Apple tarafından sağlanan aşağıdaki çözümü uygulamam ve bu issue numaralı telefondan ele aldım. UITextField
s gizli olmayan böyleceHızlıca Kaydırma Görünümü Protokolü Oluşturma 2.2
kısaca bu çözüm klavyesi göründüğünde aşağı unsurları yukarı taşımak ve farklı bir UI öğeleri yerleştirildiği UIScrollView
ve UIKeyboardDidShowNotification
ve UIKeyboardDidHideNotification
kullanır, o Özetle/kaybolur.
Bu, bir şey dışında bir çekicilik gibi çalışır: Benim tüm UIViewController
s için aynı kodu tekrarlamak zorundayım. Ben denedim benim sorunu çözmek için:
- bir taban
UIViewController
oluşturmak için farklı işlevler için bir uygulama sağlayan diğerUIViewController
s tarafından alt sınıfları olabilir; - , farklı işlevler için varsayılan bir uygulama sağlamak ve
UIViewController
lerin buna uygun olmasını sağlamak için bir protokol ve bir protokol uzantısı kullanmaktır.
Her iki çözüm de sorunumu çözmedi. İlk çözüm için, temel sınıfımın UIScrollView
arabirimine, bildirilmiş olmasına rağmen, Interface Builder aracılığıyla bağlanamadım. İkinci Çözümü uygulamak çalışırken
@IBOutlet weak var scrollView: UIScrollView!
, UIViewController
ilan yöntemler ve bunların uygulamaları tanımadı şekilde benim protokolü uygulayan.
protokolü beyanı:
extension ScrollViewProtocol where Self: UIViewController {
// The implementation for the different functions
// as described in the provided links expect for the following method
func registerFromKeyboardNotifications() {
NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardDidShowNotification, object: nil, queue: nil, usingBlock: { notification in
self.keyboardWasShown(notification)
})
NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardDidHideNotification, object: nil, queue: nil, usingBlock: { notification in
self.keyboardWillBeHidden(notification)
})
}
}
kimse benim soruna iyi bir çözüm var mı:
protocol ScrollViewProtocol {
var scrollView: UIScrollView! { get set }
var activeTextField: UITextField? { get set }
func addTapGestureRecognizer()
func singleTapGestureCaptured()
func registerForKeyboardNotifications()
func deregisterForKeyboardNotifications()
func keyboardWasShown(notification: NSNotification)
func keyboardWillBeHidden(notification: NSNotification)
func setActiveTextField(textField: UITextField)
func unsetActiveTextField()
}
protokol uzantısı ben @objc
kullanmaktan kaçınmak istiyorum gibi tüm fonksiyonlar addTapGestureRecognizer()
için beklemek uygular bilerek, klavye belirdiğinde/kaybolduğunda UITextField
s yukarı ve aşağı hareket etme ile ilgili kodu tekrar etmekten nasıl kaçınamayız? Ya da çözümlerimin neden işe yaramadığını bilen var mı?