puede - ¿Cómo crear un widget de Hoy programáticamente sin storyboard en iOS8?
widget en iphone 8 (3)
Intenté eliminar el archivo del guión gráfico y la entrada correspondiente de Info.plist
pero esta vez la extensión dejó de funcionar; ni siquiera se inicia desde XCode.
The operation couldn''t be completed. (LaunchServicesError error 0.)
Es fácil en la aplicación regular (que contiene la aplicación) ya que vemos que es el punto de entrada y el delegado de la aplicación, pero ¿cómo hacerlo en las extensiones también?
Eliminar NSExtensionMainStoryboard
de Info.plist
Agregar NSExtensionPrincipalClass = YourViewController
No te olvides de crear tu propia vista en loadView
FWIW, no funcionó para mí hasta que agregué un prefijo del nombre del módulo para mi clase de controlador de vista Swift, por ejemplo
<key>NSExtension</key>
<dict>
<!-- ... -->
<key>NSExtensionPrincipalClass</key>
<string>SafariActionExtension.RootViewController</string>
<!-- ... -->
</dict>
Probablemente se deba a que la búsqueda de clases para los módulos Swift convierte los nombres de los módulos en prefijo para el nombre de la clase. Por ejemplo, para crear su clase en código, debería escribir NSStringFromClass("SafariActionExtension.RootViewController")
, de ahí el prefijo.
Hice los siguientes pasos:
- Elimina el archivo del guión gráfico de tu proyecto
- Modificar el info.plist:
Vaya al Diccionario NSExtension, elimine esta clave: NSExtensionMainStoryboard. Reemplácelo con esta clave NSExtensionPrincipalClass y agregue su ViewController como valor, por ejemplo, TodayViewController.
antes de:
<key>NSExtension</key>
<dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widget-extension</string>
</dict>
después:
<key>NSExtension</key>
<dict>
<key>NSExtensionPrincipalClass</key>
<string>TodayViewController</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widget-extension</string>
</dict>
- Si está utilizando Swift, debe habilitar "Contenido incrustado que contiene código Swift" en la configuración de compilación del objetivo. Establézcalo en SÍ.
- Además, tuve que agregar
@objc (TodayViewController)
en mi clase TodayViewController (después de las importaciones).
La aplicación debería ejecutarse ahora. Pero había otras dos cosas que tenía que hacer:
- Crea una vista Obviamente no hay vista creada automáticamente.
Entonces agrega estas líneas:
override func loadView()
{
view = UIView(frame:CGRect(x:0.0, y:0, width:320.0, height:200.0))
}
- Y configure la altura de su widget en su método
self.preferredContentSize = CGSizeMake(0, 200)
:self.preferredContentSize = CGSizeMake(0, 200)