[iMessage扩展在尝试以紧凑模式访问UITextView时崩溃

问题描述 投票:0回答:1

下面是我在iMessage应用程序中的全部代码。

class MessagesViewController: MSMessagesAppViewController {

@IBOutlet weak var messageView: UITextView!

fileprivate func setupMessageView() {
    messageView.delegate = self

    messageView.layer.cornerRadius = 10
    messageView.layer.borderColor = UIColor.black.cgColor
    messageView.layer.borderWidth = 5

    messageView.text = "Tap to enter a message"
    messageView.textColor = UIColor(red:0.80, green:0.81, blue:0.82, alpha:1.0)
    messageView.textAlignment = .center

    messageView.font = UIFont.systemFont(ofSize: 20)

    messageView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}

func initialize() {
    setupMessageView()
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.initialize), userInfo: nil, repeats: false)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Conversation Handling

override func willBecomeActive(with conversation: MSConversation) {
    // Called when the extension is about to move from the inactive to active state.
    // This will happen when the extension is about to present UI.

    // Use this method to configure the extension and restore previously stored state.
}

override func didResignActive(with conversation: MSConversation) {
    // Called when the extension is about to move from the active to inactive state.
    // This will happen when the user dissmises the extension, changes to a different
    // conversation or quits Messages.

    // Use this method to release shared resources, save user data, invalidate timers,
    // and store enough state information to restore your extension to its current state
    // in case it is terminated later.
}

override func didReceive(_ message: MSMessage, conversation: MSConversation) {
    // Called when a message arrives that was generated by another instance of this
    // extension on a remote device.

    // Use this method to trigger UI updates in response to the message.
}

override func didStartSending(_ message: MSMessage, conversation: MSConversation) {
    // Called when the user taps the send button.
}

override func didCancelSending(_ message: MSMessage, conversation: MSConversation) {
    // Called when the user deletes the message without sending it.

    // Use this to clean up state related to the deleted message.
}

override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
    // Called before the extension transitions to a new presentation style.

    // Use this method to prepare for the change in presentation style.
}

override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
    // Called after the extension transitions to a new presentation style.

    // Use this method to finalize any behaviors associated with the change in presentation style.
}

}

extension MessagesViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
    if textView == messageView {
        requestPresentationStyle(.expanded)
        if textView.textColor == UIColor(red:0.80, green:0.81, blue:0.82, alpha:1.0) {
            textView.text = nil
            textView.textAlignment = .left
            textView.textColor = UIColor.black
            textView.font = UIFont.systemFont(ofSize: 20)
        }
    }
}

func textViewDidEndEditing(_ textView: UITextView) {
    if textView == messageView {
        if textView.text.isEmpty {
            textView.text = "Tap to enter a message"
            textView.textAlignment = .center
            textView.textColor = UIColor(red:0.80, green:0.81, blue:0.82, alpha:1.0)
            textView.font = UIFont.systemFont(ofSize: 20)
        }
    }
}
}

它有一个UITextView,我尝试输入数据。执行此操作时遇到奇怪的问题。

在初始加载时,如果我点击UITextView,则会调用扩展模式,但键盘不会向上滑动。需要再次轻按才能使键盘向上滑动。

[在日志中,我发现在第一次敲击时依次调用了textViewDidBeginEditingtextViewDidEndEditing方法。不确定,为什么会这样发生?!

无论如何,更让我着迷的是现在发生的事情。我可以将模式更改为手动压缩,然后再返回展开。如果处于扩展模式,则一旦我点击,键盘就会向上滑动。但是,如果我在紧凑模式下点击,应用程序将崩溃!

而且这种情况一直发生。在模拟器和真实设备上。我没有任何线索可以解释这种行为。

无论我将模式从压缩模式更改为展开模式,还是返回更改模式的次数,我都可以在扩展模式下输入文本。但是,在紧凑模式下,第一次轻击后再也不会发生。

有人遇到这个问题吗?还是可以复制?这是Apple的错误吗?

ios swift swift3 uitextview imessage-extension
1个回答
0
投票

如果用户在文本字段中点击后需要更改演示样式,则可以添加延迟以确保与过渡之间没有冲突。

开始时最好防止键盘显示(您可能需要在VC中设置bool标志以在textview委托中将其关闭以启用此功能,然后调用),>

  func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
    if  !shouldShowKeyBoard {
        self.requestPresentationStyle(.expanded)
        return false
    }
    return true

然后在MSMessagesAppViewController委托中使键盘成为第一响应者`

 override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
    if presentationStyle == .expanded {
       shouldShowKeyBoard = true
       textView.becomeFirstResponder()
    }
}

`

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.