如何使 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() 返回truecomposeBar.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 应用程序中变为活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何使页面控件在每个视图中显示文本

如何使基础设施码头管理器覆盖其他控件?

如何使用户控件像窗口一样在屏幕上可拖动

在VC++如何使控件大小修改为规定的大小?

WPF C#如何使用鼠标使控件可拖动

如何使焦点保持在同一对话框上的所有列表控件上?