如何使 PHFComposeBarView 控件在 Swift iOS 应用程序中变为活动状态?
Posted
技术标签:
【中文标题】如何使 PHFComposeBarView 控件在 Swift iOS 应用程序中变为活动状态?【英文标题】:How do I make a PHFComposeBarView control become active in a Swift iOS app? 【发布时间】:2015-07-06 12:36:50 【问题描述】:作为 ios 开发的相对新手,我正在努力使 PHFComposeBarView 控件在我的 Swift iOS 应用程序中变得活跃。
在PHFComposeBarView example app 和this SO answer 中眯着眼睛看Obj-C,我已经尽力将基本设置翻译成Swift,以便控件显示在主视图中:
但是,我还没有设法使控件以编程方式变为活动状态。
我在 Swift 2.0/XCode 7.0 Beta 2 中创建了一个 minimal test case project,它的 ViewController 看起来像:
ViewController.swift:
import UIKit
import PHFComposeBarView
class ViewController: UIViewController, PHFComposeBarViewDelegate
var composeBar: PHFComposeBarView
let viewBounds = self.view.bounds
let frame = CGRectMake(0.0, viewBounds.size.height - PHFComposeBarViewInitialHeight, viewBounds.size.width, PHFComposeBarViewInitialHeight)
let composeBarView = PHFComposeBarView(frame: frame)
composeBarView.delegate = self
return composeBarView
override var inputAccessoryView: UIView
return self.composeBar
override func canBecomeFirstResponder() -> Bool
return true
override func viewDidAppear(animated: Bool)
print("viewDidAppear self \(self)")
print("composeBar.delegate \(self.composeBar.delegate)")
print("composeBar.textView.delegate \(self.composeBar.textView.delegate)")
print("composeBar.canBecomeFirstResponder() \(self.composeBar.canBecomeFirstResponder())")
print("composeBar.textView.canBecomeFirstResponder() \(self.composeBar.textView.canBecomeFirstResponder())")
let res = self.composeBar.becomeFirstResponder()
print("composeBar.becomeFirstResponder() \(res)")
print("composeBar.isFirstResponder() \(self.composeBar.isFirstResponder())")
print("composeBar.textView.isFirstResponder() \(self.composeBar.textView.isFirstResponder())")
控制台:
viewDidAppear self <SwiftPHFComposeBarTest.ViewController: 0x7fe088619d90>
composeBar.delegate Optional(<SwiftPHFComposeBarTest.ViewController: 0x7fe088619d90>)
composeBar.textView.delegate Optional(<PHFDelegateChain: 0x7fe088654850>)
composeBar.canBecomeFirstResponder() true
composeBar.textView.canBecomeFirstResponder() true
composeBar.becomeFirstResponder() false
composeBar.isFirstResponder() false
composeBar.textView.isFirstResponder() false
怎么可能composeBar.canBecomeFirstResponder()
返回true
而composeBar.becomeFirstResponder()
返回false
?
另外,我不确定作为 Optional 的委托是否有问题。
编辑:更新为包含调试输出。
【问题讨论】:
快速搜索“输入附件视图成为第一响应者”返回:***.com/questions/19983179/… 谢谢菲利普。可悲的是,在我的viewDidAppear()
方法的末尾添加 self.view.window!.makeKeyAndVisible()
没有任何区别。然而,我注意到我在 iOS 9 beta 和 iOS 8.3 中得到了不同的行为,因为在 8.3 中点击控件确实会按预期显示键盘,但是在尝试键入字符时会因EXC_BAD_ACCESS
异常而崩溃。我会看看是否可以将其缩小到 iOS 版本问题。
嗯,好像不是这样,PHFComposeBarView 示例应用在 8.3 和 9.0 测试版中运行良好。
抱歉,不确定是什么。尝试改用简单的文本视图,看看是否可行并从那里排除故障。祝你好运!
注:帖子已更新以包含调试输出。
【参考方案1】:
嗯,一个解决方案似乎是use the storyboard instead:
ViewController.swift:
import UIKit
import PHFComposeBarView
class ViewController: UIViewController, PHFComposeBarViewDelegate
@IBOutlet weak var composeBarView: PHFComposeBarView!
override func viewDidLoad()
super.viewDidLoad()
composeBarView.delegate = self
override func canBecomeFirstResponder() -> Bool
return true
override var inputAccessoryView: UIView
composeBarView.removeFromSuperview()
return composeBarView
【讨论】:
你有没有检查过在文本视图打开后点击 2 次......??它会消失..以上是关于如何使 PHFComposeBarView 控件在 Swift iOS 应用程序中变为活动状态?的主要内容,如果未能解决你的问题,请参考以下文章