5

Có một vài trường hợp errors trong các kịch bản thời gian thực trên ứng dụng iOS của tôi. Tôi không thể hiểu được lỗi cụ thể này trên Core Foundation đang ảnh hưởng đến nhiều người dùng trong ứng dụng của tôi. Luồng không phá vỡ bất kỳ tệp dự án nào của tôi và tôi không chắc chắn nguyên nhân gây ra sự cố này.Bộ chọn không được nhận dạng được gửi đến ví dụ _UIAlertControllerAlertPresentationController

Đính kèm nhật ký crashlytics. Bất kỳ lời khuyên hay sự giúp đỡ nào sẽ giúp ích rất nhiều, thanx.

CoreFoundation _CF_forwarding_prep_0

Fatal Exception: NSInvalidArgumentException - [_ UIAlertControllerAlertPresentationController adaptivePresentationController]: chọn không được công nhận gửi đến dụ 0x133e29870

Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation     0x18ff391b8 __exceptionPreprocess 
1 libobjc.A.dylib    0x18e97055c objc_exception_throw 
2 CoreFoundation     0x18ff40268 __methodDescriptionForSelector 
3 CoreFoundation     0x18ff3d270 ___forwarding___ 
4 CoreFoundation     0x18fe3680c _CF_forwarding_prep_0 
5 UIKit       0x19689708c -[UISearchController _searchPresentationController] 
6 UIKit       0x19648f8cc -[_UISearchControllerTransplantSearchBarAnimator animateTransition:] 
7 UIKit       0x19613d464 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke 
8 UIKit       0x19607ffdc _runAfterCACommitDeferredBlocks 
9 UIKit       0x196071d50 _cleanUpAfterCAFlushAndRunDeferredBlocks 
10 UIKit       0x195de10b4 _afterCACommitHandler 
11 CoreFoundation     0x18fee60c0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 
12 CoreFoundation     0x18fee3cf0 __CFRunLoopDoObservers 
13 CoreFoundation     0x18fee4180 __CFRunLoopRun 
14 CoreFoundation     0x18fe122b8 CFRunLoopRunSpecific 
15 GraphicsServices    0x1918c6198 GSEventRunModal 
16 UIKit       0x195e597fc -[UIApplication _run] 
17 UIKit       0x195e54534 UIApplicationMain 
18 Levo       0x1000c1c30 main (AppDelegate.swift:22) 
19 libdispatch.dylib    0x18edf55b8 (Missing) 
func showErrorView(errorType: ErrorType, retryClickDelegate: ErrorViewRetryClickDelegate?) { 
    var message = "" 
    switch errorType { 
    case .INTERNET: 
     message = "Your internet connection does not seem to be working. Kindly ensure that you are connected to the internet and try again" 
     break 
    case .INVALID_DATA: 
     message = "Something went wrong. Please try again!" 
     break 
    case .JSON_PARSING: 
     message = "Something went wrong. Please try again!" 
     break 
    case .UNAUTHORIZED: 
     self.showInformativeAlert("Logged Out", message: "Looks like you have been logged out. Please login in again!", completion: nil) 
     self.switchStoryboard(Storyboard.SIGNIN) 
     return 
    default: 
     message = "Something went wrong. Please try again!" 
    } 

    let errorAlert = UIAlertController(title: "Error", message: message, preferredStyle: .Alert) 
    if let retryClickDelegate = retryClickDelegate { 
     errorAlert.addAction(UIAlertAction(title: "Try again", style: UIAlertActionStyle.Default, handler: { (action) in 
      retryClickDelegate.onErrorRetryClicked(errorType) 
      errorAlert.dismissViewControllerAnimated(true, completion: nil) 
     })) 
    } 
    errorAlert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil)) 

    if (isTopViewController) { 
     self.presentViewController(errorAlert, animated: true, completion: nil) 
    } 
} 

func showInformativeAlert(title: String?, message: String?,completion : (() -> Void)?) { 
    let informativeAlert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
    informativeAlert.addAction(UIAlertAction(title: "Got it!", style: UIAlertActionStyle.Default, handler: { (action) in 
     informativeAlert.dismissViewControllerAnimated(true, completion: nil) 
     completion?() 
    })) 
    self.presentViewController(informativeAlert, animated: true, completion: nil) 
} 

public var isTopViewController: Bool { 
    if self.navigationController != nil { 
     return self.navigationController?.visibleViewController === self 
    } else if self.tabBarController != nil { 
     return self.tabBarController?.selectedViewController == self && self.presentedViewController == nil 
    } else { 
     return self.presentedViewController == nil && self.isVisible 
    } 
} 
+0

bạn có thể hiển thị mã đã thử của mình –

+0

Bản sao có thể có của http://stackoverflow.com/questions/36834755/cancelling-search-with-uisearchcontroller-causes-crash – Sulthan

+0

@ Anbu.Karthik - Tôi không chắc nơi xảy ra sự cố đang diễn ra, đã chỉnh sửa bài đăng với mã có thể đã cố gắng. Tôi có những ErrorViews thêm vào phần mở rộng UIViewController của tôi. – Muthu

Trả lời

0

Tôi nghĩ rằng vấn đề là bạn không sử dụng trình xử lý hoàn thành chính xác, do đó đồng thời có một cảnh báo xuất hiện và biến mất. Ví dụ, thay vì:

informativeAlert.dismissViewControllerAnimated(true, completion: nil) 
    completion?() 

Bạn nên sử dụng

informativeAlert.dismissViewControllerAnimated(true, completion: completion) 

Ngoài ra, việc thực hiện isTopViewController có thể thất bại một cách dễ dàng nếu một hình ảnh động xem điều khiển đang trong quá trình.

Ví dụ: nếu bạn gọi showErrorView hai lần, isTopViewController có thể là true cho cả cuộc gọi và hai cảnh báo sẽ bắt đầu xuất hiện cùng một lúc, làm hỏng ứng dụng của bạn.

Các vấn đề liên quan