ios - necesario - Cómo obtener un puntero global para ver el controlador en forma rápida
itunes no reconoce mi iphone (3)
Estoy construyendo una aplicación usando swift. En mi aplicación, necesito presentar un UIPopoverPresentationController, y también necesito acceder al controlador de contenido de ese popover desde otros métodos en mi controlador de vista normal.
Para hacer esto, normalmente en el objetivo C simplemente creo un puntero global para mi controlador de vista, lo que me permitiría acceder a él desde cualquier método.
Así es como lo haría en Swift:
class Categories: UITableViewController, UIPopoverPresentationControllerDelegate {
let storyBoard = UIStoryboard(name: "Main", bundle:nil)
var newCategory = self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as NewCategory
//rest of my code
Cuando hago esto, Xcode me da el error:
Categories.type does not have a member named ''storyBoard''
¿Alguien puede decirme qué estoy haciendo mal y cómo debo modificar mi código para crear un puntero global legítimo para mi controlador de vista? ¡Cualquier ayuda sería muy apreciada!
Deberías usar el atributo @lazy para esto. El fuelle es el recibo general:
class MyClass {
let compileTimeProperty = "compileTimePropert"
@lazy var runTimeProperty:String = {
return self.compileTimeProperty
}()
}
Y así es como debe ajustarse su código:
class Categories: UITableViewController, UIPopoverPresentationControllerDelegate {
let storyBoard = UIStoryboard(name: "Main", bundle:nil)
@lazy var newCategory: NewCategory = {
return self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as NewCategory
}()
//rest of your code
}
Está poniendo esa declaración var
fuera de cualquier código (es decir, en el nivel superior de la clase Categorías, no dentro de ninguna función). No puede referirse a self
en el valor predeterminado de una declaración de variable fuera de un func
menos que también declare esa variable como @lazy
.
Por lo tanto, en general:
class MyClass {
let howdy = "howdy"
var hello = self.howdy // illegal
func f() {
var hello = self.howdy // legal
}
}
Su código solo proporciona valores predeterminados para storyBoard
y newCategory
, pero Swift no garantiza que los valores de propiedad predeterminados se inicialicen en un orden en particular. En consecuencia, es ilegal hacer referencia a otra propiedad en el valor predeterminado para uno. Mueva el código para establecer esos valores en un init
y debería funcionar bien:
class Categories: UITableViewController, UIPopoverPresentationControllerDelegate {
let storyBoard: UIStoryboard
var newCategory: NewCategory
init {
storyBoard = UIStoryboard(name: "Main", bundle:nil)
newCategory = self.storyBoard.instantiateViewControllerWithIdentifier("NewCategory") as NewCategory
}
//rest of code
Para tener claridad sobre la terminología: declarar las variables en el nivel superior de la clase como este no las convierte en "variables globales", sino que hace las propiedades de la clase. (Las variables globales se declaran fuera del alcance de cualquier clase / estructura / función). Además, las reglas para las propiedades son diferentes de otras variables, ya que NO es necesario asignar un valor cuando las declaras (y si lo haces, es solo se trata como un valor predeterminado): el requisito real es que debe proporcionar un valor predeterminado, O asignar un valor en el inicializador.
Pero para este caso particular, la solución de @enzy de @lazy
es la opción más apropiada.