2015-07-09 16 views
5

Dự án hiện tại của tôi hỗ trợ iOS 7+ và trong một trong các trình điều khiển chế độ xem của tôi, tôi đang cố sử dụng cả UIAlertView và UIAlertController.Cách kiểm tra tính khả dụng của các biến lớp

Tôi có #available có điều kiện làm việc trong các phương pháp của tôi, nhưng tôi không chắc chắn làm thế nào để bọc các vars.

Khi tôi có:

var alertController: UIAlertController! 
var alertView: UIAlertView! 

tôi nhận được một thông báo lỗi nói với tôi UIAlertController chỉ có sẵn trong iOS 8+ và tùy chọn 'Fix It' bởi "Thêm @available để bao quanh lớp". Tuy nhiên tôi nghĩ rằng điều này đánh dấu toàn bộ lớp học, và đó không phải là những gì tôi muốn.

+1

Bạn phải sử dụng toàn bộ lớp, bởi vì bất cứ thứ gì bên trong lớp đều có quyền truy cập vào thuộc tính này, bạn có thể cần các lớp con khác nhau hoặc có thể các lớp khác nhau trong lớp của bạn – Kametrixom

+0

Ồ đúng, điều đó thực sự có ý nghĩa rất nhiều. Bạn không chắc chắn làm thế nào để có được vùng phủ sóng thử nghiệm trên chúng mà không làm cho họ có thể truy cập mặc dù. Có thể phải rời khỏi nó ngay bây giờ. Cảm ơn bạn. –

+3

Đây là nơi bạn nên sử dụng khả năng thừa kế và trừu tượng của lập trình hướng đối tượng. Bạn không nên trưng ra UIAlertView hoặc UIAlertController - lớp của bạn nên trưng ra các phương thức để thực hiện các thao tác thích hợp với các chi tiết được trừu tượng hóa và ẩn bên trong lớp thực hiện – Paulw11

Trả lời

16

Tôi chỉ tình cờ gặp vấn đề này và tôi cũng đã phải vật lộn để tìm một giải pháp để kết thúc lên làm cho các biến lười biếng và mặc định để nil khi thêm chú thích sẵn có

Đối với thực hiện của bạn sẽ trông như sau:

@available(iOS 8.0, *) 
lazy var alertController: UIAlertController? = { return nil }() 

Sau đó, bất cứ khi nào bạn cố gắng và truy cập mà sở hữu các trình biên dịch sẽ đảm bảo nó được bảo vệ trong một kiểm tra tính sẵn sàng để bạn luôn có:

if #available(iOS 8.0, *) { 
    self.alertController = ... 
} else 
    self.alertView = ... 
} 
+0

Câu trả lời tuyệt vời và khá nhiều những gì tôi đã sau. Cảm ơn bạn. –

+0

cũng hoạt động trên xcode 9 beta 3 :) –

1

Nếu bạn chỉ cần sử dụng cảnh báo trong một hàm, bạn chỉ có thể di chuyển mã của bạn vào khối func và XCode 7 sẽ đưa ra đề xuất hoạt động.

Điều gì xảy ra nếu bạn cần sử dụng cảnh báo trong một số khối func và tham chiếu cùng một đối tượng cảnh báo lặp đi lặp lại?

Bạn có thể sử dụng UIResponder mới và chuyển nó xuống UIAlertController hoặc UIView dựa trên tính khả dụng. Tôi đã không thử nghiệm nó trong dự án của tôi, nhưng nó sẽ làm việc.

let alertContainer: UIResponder? 

init() { 
    if #available(iOS 8.0, *) { 
     let alertController: UIAlertController! 
     alertContainer = alertController 
    } else { 
     let alertView: UIAlertView! 
     alertContainer = alertView 
    } 
} 

func someFunction() { 
    if #available(iOS 8.0, *) { 
     var alertController = alertContainer as! UIAlertController 
     // use the alertController 
    } else { 
     var alertView = alertContainer as! UIAlertView 
     // use the UIAlertView 
    } 
} 

Điều này thực sự bổ sung thêm mã, nhưng nó vượt qua kiểm tra của Xcode. Nếu bạn nghĩ ra giải pháp tốt hơn, hãy cho tôi biết.

+0

Xem câu trả lời của Daniels. Những gì bạn đã trình bày cũng là một giải pháp tốt cho khi muốn giữ mọi thứ riêng biệt. –

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