2016-02-09 16 views
5

Trong một dự án tôi đang làm việc, tôi phải viết mô-đun trợ giúp UIAlert để hiển thị cửa sổ bật lên tại đây và trong ứng dụng iOS của tôi. Các cửa sổ bật lên được viết như là các hàm lớp mà tôi có thể chỉ đơn giản gọi bất cứ nơi nào trong mã (lớp là tĩnh và vì vậy tất cả các hàm).UIAlertController - Hành động không được thực thi nếu cảnh báo bị loại bỏ lần đầu tiên

Tôi hiện đang gặp phải một lỗi rất lạ khi bạn loại bỏ cảnh báo một lần, sau đó mở lại, hành động của nó không hoạt động nữa (như trong trình xử lý tác vụ không được gọi). Nó không có tác dụng nếu bạn nhấp vào hành động lần đầu tiên popup được hiển thị, mặc dù ...

Đây là mã cho popup cụ thể mà lỗi này xảy ra (không popup khác bị ảnh hưởng gì):

static func popSkipWalkthrough() { 
    let alert = UIAlertController(title: "Skip", message: "whatever", preferredStyle: .Alert) 

    alert.addAction(cancelAction) 
    alert.addAction(skipWalkthroughAction) 
    appDelegate.window!.rootViewController!.presentViewController(alert, animated: true, completion: nil) 
} 

các skipWalkthroughAction được định nghĩa như sau:

static let skipWalkthroughAction = UIAlertAction(title: "Continue", style: .Default, handler: { (action: UIAlertAction!) -> Void in 
    appDelegate.setWindowViewTo("NavCtrl", navigateTo: false) 
    CallIn.Settings.didWalkthrough = true 
}) 

cancelAction được định nghĩa là:

static let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 

cửa sổ bật lên đặc biệt này được hiển thị mỗi khi bạn nhấn 'bỏ qua' nút trong bước cuối cùng của một walk-through ...

Tôi đã thử một vài dẫn về những gì là nguyên nhân cho hành vi này là, và Tôi nghĩ rằng nó có thể có một cái gì đó để làm với popup không thực sự được deallocated, nhưng tôi không chắc chắn ở tất cả các điểm này ...

Bất kỳ ý tưởng?

Trả lời

4

Tất cả mặc dù tôi gặp sự cố với cách mã được sử dụng lại này được mã hóa, sự cố này có thể được giải quyết bằng cách gửi thông báo copy: tới skipWalkthroughAction. Chỉ cần thực hiện một:

static func popSkipWalkthrough() { 
    let alert = UIAlertController(title: "Skip", message: "whatever", preferredStyle: .Alert) 

    alert.addAction(cancelAction.copy() as! UIAlertAction) 
    alert.addAction(skipWalkthroughAction.copy() as! UIAlertAction) 
    appDelegate.window!.rootViewController!.presentViewController(alert, animated: true, completion: nil) 
} 

Điều này sẽ giải quyết được.

Bạn cũng có thể giải quyết vấn đề này bằng cách di chuyển alert đến cấp độ thể hiện. Bạn không phải gửi copy: sau đó.

cách tiếp cận tốt hơn

Nếu bạn muốn có một "thực sự" kinh nghiệm tái sử dụng của UIAlertController, bạn là tốt hơn hết tạo ra một phần mở rộng UIViewController. Tôi có điều này trong một trong các dự án của tôi:

extension UIViewController { 
    func showAlertControllerWithTitle(title:String?,message:String?,actions:[UIAlertAction],dismissingActionTitle:String?, dismissBlock:(() ->())?) -> UIAlertController { 
     let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
     if dismissingActionTitle != nil { 
      let okAction = UIAlertAction(title: dismissingActionTitle, style: .Default) { (action) -> Void in 
       dismissBlock?() 
       alertController.dismissViewControllerAnimated(true, completion:nil) 
      } 
      alertController.addAction(okAction) 
     } 
     for action in actions { 
      alertController.addAction(action) 
     } 
     self.presentViewController(alertController, animated: true, completion:nil) 
     return alertController 
    } 
} 
+0

Điều này đã sửa nó! Cảm ơn. Bạn cũng có thể vui lòng giải thích lý do tại sao bạn đang gặp vấn đề về cách tôi đã viết? Có giải pháp nào tốt hơn không? – Skwiggs

+1

@Skwiggs, vui lòng xem chỉnh sửa. – avismara

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