2015-07-09 9 views
5

Il mio progetto corrente supporta iOS 7+ e in uno dei miei controller di visualizzazione sto cercando di utilizzare sia UIAlertView che UIAlertController.Come eseguire un controllo di disponibilità sulle variabili di classe

Ho il condizionale #available che funziona nei miei metodi, ma non sono sicuro di come avvolgere i vars.

Quando ho:

var alertController: UIAlertController! 
var alertView: UIAlertView! 

ricevo un messaggio di errore che mi dice UIAlertController è disponibile solo in iOS 8+ e la possibilità di 'risolvere il problema' da "Aggiunta @available all'includere di classe". Comunque penso che questo segna l'intera classe, e non è quello che voglio.

+1

Devi usare la classe completa, perché qualsiasi cosa all'interno della classe ha accesso a questa proprietà, potresti aver bisogno di sottoclassi diverse o forse classi diverse all'interno della classe – Kametrixom

+0

Oh, giusto, questo ha davvero molto senso. Non è sicuro di come ottenere copertura di prova su questi senza renderli accessibili però. Potrebbe lasciarlo per ora. Grazie. –

+3

Qui è dove si dovrebbero usare le funzionalità di ereditarietà e astrazione della programmazione orientata agli oggetti. Non dovresti esporre UIAlertView o UIAlertController - la tua classe dovrebbe esporre i metodi per eseguire le operazioni appropriate con i dettagli astratti e nascosti all'interno dell'implementazione della classe – Paulw11

risposta

16

Ho appena imbattuto in questo problema e anche io ho faticato a trovare una soluzione in modo ha finito per fare la variabile pigro e inadempiente a zero, mentre l'aggiunta delle disponibilità per annotazioni

Per la vostra implementazione che apparirebbe come segue:

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

Poi ogni volta che si cerca di accesso che la proprietà il compilatore assicurarsi che il suo custodita in un controllo di disponibilità in modo da avere sempre:

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

Risposta stupenda e praticamente quello che cercavo. Grazie. –

+0

funziona anche su xcode 9 beta 3 :) –

1

Se è sufficiente utilizzare l'avviso in una funzione, è sufficiente spostare il codice nel blocco func e XCode 7 visualizzerà un suggerimento che funziona.

E se fosse necessario utilizzare l'avviso in diversi blocchi funzionali e fare riferimento allo stesso oggetto di avviso più e più volte?

È possibile utilizzare un nuovo UIResponder e downcast su UIAlertController o UIView in base alla disponibilità. Non l'ho testato nel mio progetto, ma dovrebbe funzionare.

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 
    } 
} 

Questo in realtà aggiunge più codici, ma supera il controllo Xcode. Se trovi una soluzione migliore, faccelo sapere.

+0

Dai un'occhiata alla risposta di Daniels. Quello che hai presentato è anche una buona soluzione per quando vuoi tenere tutto separato. –

Problemi correlati