Swift - 呈现已呈现的弹出框时应用程序崩溃

Posted

技术标签:

【中文标题】Swift - 呈现已呈现的弹出框时应用程序崩溃【英文标题】:Swift - app crash when presenting popover as already presented 【发布时间】:2020-12-01 22:07:56 【问题描述】:

我有一个文本字段,当用户在其中键入时,它会触发一个弹出框,显示一个用户可以从中选择的建议值列表。这是文本字段:

lazy var iata: CustomTextField = 
    let field = CustomTextField(
        title: Strings.originAiportCode.localized,
        placeholder: Strings.originAirportCodePlaceholder.localized,
        allowSpaceInput: false)
    
    field.configureField(with: TextInputKeyboardSettings(
        capitalization: .allCharacters,
        spellCheck: .no,
        returnKey: .done
    ))

    field.textDidChangeAction =  [weak self] in
        self?.search(field: field)
        self?.iataError.isHidden = true
    
    
    field.shouldEndEditingAction =  [weak self] in
        self?.verifyTextfieldInput()
    
    
    validator.registerField(field, rules: [RequiredRule(message: Strings.eHandshake.validation.iataRequired.localized)])
    
    return field
()

didChangeAction 在 CustomTextField 类上声明如下:

public var textDidChangeAction: (() -> Void)?

这作为一个闭包传递给委托方法,如下所示:

public func textFieldDidChangeSelection(_ textField: UITextField) 
    textDidChangeAction?()

这里是搜索方法:

func search(field: CustomTextField) 
    if iata.text.isEmpty 
        popover.dismiss(animated: true, completion: nil)
     else 
        
        let filterCompletion: (Int) -> () =  count in
            self.popover.sourceView = field
            
            // Present if needed
            let isPopoverPresented = self.popover.isVisiblyPresented
            if !isPopoverPresented && count > 0 
                self.present(self.popover, animated: false, completion: nil)
            
            
            if isPopoverPresented && count == 0 
                self.popover.dismiss(animated: false, completion: nil)
            
        
        popover.filterToSearchTerm(field.text, objects: airportsList, completion:filterCompletion)
    

现在一切正常,如果用户在文本字段中输入得太快,在这种情况下我会遇到崩溃并出现以下错误:

Thread 1: "Application tried to present modally a view controller <project.ContainerPopover: 0x7fc736eabeb0> that is already being presented by <project.TabBarController: 0x7fc737838200>."

这个弹出框正在接收的数据列表非常大,很明显,应用程序正在挣扎,因为它试图在 vc 已经存在时呈现它。但是,我对如何解决这个问题感到困惑。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我似乎已经解决了这个问题!我在展示/关闭时添加了第二次检查:

(!self.popover.isBeingPresented && !self.popover.isVisiblyPresented)

似乎这样可以确保弹出框既没有呈现也没有明显呈现,这已经解决了问题

【讨论】:

以上是关于Swift - 呈现已呈现的弹出框时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

试图关闭故事板呈现的弹出框

在 iOS 8 中呈现弹出框时如何使屏幕模糊

从 UIButton 中获取 UIButton 的标签,该 UIButton 位于此 UIButton 呈现的弹出框中

UIPoover 锁定背景视图

使用动画在 iPad 上呈现和隐藏​​弹出框

滚动视图中的 Swift 弹出框