-1

Ş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ğer UIViewController 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ı?

cevap

0

Bir çözüm buldum. Birisi aynı şeyi yapmak için birileriyle göndereceğim.

Bu yüzden, temel sınıfımdaki UIScrollView çıkışını silip, devralma sınıflarımda ayarladığım basit bir özellikle değiştirdim. aşağıdaki gibi benim temel sınıf görünüm için kod: Ben bu yardımcı olacağını umuyoruz

class ViewController: ScrollViewController { 

    @IBOutlet weak var scrollViewOutlet: UIScrollView! { 
     didSet { 
      self.scrollView = self.scrollViewOutlet 
     } 
    } 

    // Your view controller functions 

} 

: Burada

import UIKit 

class ScrollViewController: UIViewController, UITextFieldDelegate { 

    // MARK: Properties 

    var scrollView: UIScrollView! 
    var activeTextField: UITextField? 

    // MARK: View cycle 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let singleTap = UITapGestureRecognizer(target: self, action: #selector(singleTapGestureCaptured)) 
     scrollView.addGestureRecognizer(singleTap) 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     registerForKeyboardNotifications() 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 
     deregisterFromKeyboardNotifications() 
    } 

    // MARK: Gesture recognizer 

    func singleTapGestureCaptured(sender: AnyObject) { 
     view.endEditing(true) 
    } 

    // MARK: Keyboard management 

    func registerForKeyboardNotifications() { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillBeHidden), name: UIKeyboardWillHideNotification, object: nil) 
    } 

    func deregisterFromKeyboardNotifications() { 
     NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) 
    } 

    func keyboardWasShown(notification: NSNotification) { 
     scrollView.scrollEnabled = true 

     let info : NSDictionary = notification.userInfo! 
     let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
     let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) 

     scrollView.contentInset = contentInsets 
     scrollView.scrollIndicatorInsets = contentInsets 

     var aRect : CGRect = self.view.frame 
     aRect.size.height -= keyboardSize!.height 
     if let activeFieldPresent = activeTextField { 
      if (!CGRectContainsPoint(aRect, activeFieldPresent.frame.origin)) { 
       scrollView.scrollRectToVisible(activeFieldPresent.frame, animated: true) 
      } 
     } 
    } 

    func keyboardWillBeHidden(notification: NSNotification) { 
     let info : NSDictionary = notification.userInfo! 
     let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size 
     let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0) 

     scrollView.contentInset = contentInsets 
     scrollView.scrollIndicatorInsets = contentInsets 

     view.endEditing(true) 
     scrollView.scrollEnabled = false 
    } 

    // MARK: Text field management 

    func textFieldDidBeginEditing(textField: UITextField) { 
     activeTextField = textField 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     activeTextField = nil 
    } 
} 

Ve sınıfı kalıtımla kodudur!

İlgili konular