gpt4 book ai didi

ios - 在 swift IOS 中使代码更有条理

转载 作者:搜寻专家 更新时间:2023-11-01 07:22:29 25 4
gpt4 key购买 nike

我正在努力使我的代码更有组织性和可重用性。我有一些功能和通知,允许在键盘出现时向上移动 ScrollView ,并在键盘隐藏时向下滚动。一切正常。但是,我想这些功能将用于我的项目的多个部分,这些部分在 UIViewcontroller 中有 scrollView。所以我想创建一个更可重用的代码,而不是在多个 View Controller 中编写相同的代码。

目前,在我的一个 View Controller 中,我有

var keyboard = CGRect() 

override func viewDidLoad() {

// Check notifications of keyboard activity
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PostVC.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PostVC.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil)

// Tap to hide keyboard
let hideTap = UITapGestureRecognizer(target: self, action: #selector(PostVC.hideKeyboard))
hideTap.numberOfTapsRequired = 1
self.view.userInteractionEnabled = true
self.view.addGestureRecognizer(hideTap)
}

func hideKeyboard() {
self.view.endEditing(true)
}


func keyboardWillShow(notification: NSNotification) {

keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRectValue())!

UIView.animateWithDuration(0.4) {
self.scrollView.contentSize.height = self.view.frame.size.height + self.keyboard.height / 2 + UITabBarController().tabBar.frame.size.height
}
}

func keyboardWillHide(notification: NSNotification) {

UIView.animateWithDuration(0.4) {
self.scrollView.contentSize.height = 0
}
}

我对尝试使代码更具可重用性有点陌生。我不确定我是否需要创建一个新类或只是创建一个 UIViewcontroller 的扩展并将它放在那里。我试过创建 UIViewcontroller 的扩展并做一些类似的事情

func keyboardWillShow(notification: NSNotification, _scrollView: UIScrollView) { }

并将 ScrollView 的一个实例(@IBOutlet weak var scrollView: UIScrollView!)传递给函数。但是,然后我在执行 #selector(keyboardWillShow(_:, keyboard: keyboard, scrollView: scrollView) 时遇到了麻烦。它给了我一个错误,说表达式列表中的预期表达式(我认为它是提示 _:)。我可能走上了一条完全错误的道路。任何人都可以帮忙。

谢谢,

最佳答案

我建议创建一个协议(protocol)并将默认实现添加为协议(protocol)扩展。在协议(protocol)中,您可以添加实现它的类应该有一个 scrollView 和一个键盘。请记住,协议(protocol)扩展比基类更灵活,这就是为什么在 Swift 中通常更受欢迎。

举个例子

protocol Scrollable : class {

var scrollView: UIScrollView { get }
var keyboardRect: CGRect { get set }
}

extension Scrollable where Self : UIViewController {

func registerForKeyboardNotifications() {

NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillShowNotification, object: nil, queue: nil, usingBlock: { (notification) in

self.keyboardWillShow(notification)
})
NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillHideNotification, object: nil, queue: nil, usingBlock: { (notification) in

self.keyboardWillHide(notification)
})
}

func deregisterForKeyboardNotification() {

NSNotificationCenter.defaultCenter().removeObserver(self)
}

func keyboardWillShow(notification: NSNotification) {

self.keyboardRect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRectValue())!

UIView.animateWithDuration(0.4) {
self.scrollView.contentSize.height = self.view.frame.size.height + self.keyboardRect.height / 2 + UITabBarController().tabBar.frame.size.height
}
}

func keyboardWillHide(notification: NSNotification) {

UIView.animateWithDuration(0.4) {
self.scrollView.contentSize.height = 0
}
}
}

请记住,我使用了 addObserverForName 而不是 addObserver,因为后者不能轻松地与协议(protocol)扩展一起使用。您可以在此处阅读更多相关信息 - Swift make protocol extension a Notification observer

关于ios - 在 swift IOS 中使代码更有条理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38080369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com