5

Ich verwende das heutige Widget für iOS8, um Informationen anzuzeigen, die für den aktuellen Tag relevant sind. Das Problem ist, dass ich das Widget/Abschnitt überhaupt nicht anzeigen möchte, wenn keine relevanten Nachrichten angezeigt werden.Wie kann ich das iOS 8 Today Widget ausblenden, wenn nichts angezeigt wird?

Ich weiß, es muss möglich sein, wie die BA App es tut (es zeigt nur das Widget, wenn es einen Flug gibt, der Rest der Zeit ist überhaupt nicht sichtbar). Ich kann einfach keinen Weg finden, dieses Verhalten zu erreichen.

Weiß jemand, wie das geht?

Antwort

12

Ich fand den Weg, dies zu tun ist mit der NCWidgetController. Auf diese Weise können Sie ganz einfach angeben, wann das heutige Widget angezeigt werden soll, basierend auf den Kriterien, die Sie für richtig halten.

Fügen Sie einfach den folgend in Ihre viewDidLoad Methode (oder irgendwo, die aufgerufen wird, wenn das Widget neu geladen) in den heute widget-View-Controller und es wird funktionieren:

BOOL hasDataToDisplay = NO; 

NCWidgetController *widgetController = [NCWidgetController widgetController]; 
[widgetController setHasContent:hasDataToDisplay forWidgetWithBundleIdentifier:@"com.my-company.my-app.my-widget"]; 

Apple-Docs:https://developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetController_Class/index.html#//apple_ref/occ/cl/NCWidgetController

WARNUNG: Die NCWidgetController kann nicht vom Widget selbst zurückgesetzt werden, nachdem Sie festgelegt haben, dass kein Inhalt angezeigt werden soll. Mit anderen Worten, sobald Sie es auf NO setzen, dann gibt es kein zurück, es sei denn, Sie lösen es aus der übergeordneten/enthaltenden App aus.

+0

hallo, tahnks für die Super-Antwort, aber Frage bitte für diese Anmerkung: „Die NCWidgetController können nicht aus dem Widget selbst zurückgesetzt werden, sobald Sie festgelegt haben Es gibt keinen Inhalt zum Anzeigen. Mit anderen Worten, sobald Sie es auf NEIN setzen, gibt es kein Zurück mehr, es sei denn, Sie lösen es aus der übergeordneten App aus."Wie kann ich es" von der Eltern/App auslösen. "Ich habe dich nicht sehr gut, können Sie mir ein Beispiel geben? Danke so bush – Rawan

-1

Es ist besser zu nutzen

+ (instancetype)widgetController 

rufen dann

- (void)setHasContent:(BOOL)flag forWidgetWithBundleIdentifier:(NSString *)bundleID 
+0

Warum denken Sie, dass das besser ist? – defense2000x

+0

@ defense2000x, weil das bei https dokumentiert ist : //developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetController_Class/index.html#//apple_ref/occ/clm/NCWidgetController/widgetController – jeeeyul

3

Bei dem Verfahren hinzufügen viewDidLoad des Viewcontroller des Widgets folgendes:

BOOL DisplayWidget = NO; 
[[NCWidgetController widgetController] setHasContent:DisplayWidget 
         forWidgetWithBundleIdentifier:@"<widget's bunder identifier>"]; 

Dies wird das Widget aus zeigt deaktivieren.

Um es erneut zu aktivieren, müssen Sie dies von der enthaltenen App aus tun, indem Sie dieselbe Zeile verwenden und YES an setHasContent übergeben. Stellen Sie sicher, dass die notwendigen Einfuhren in die enthaltende Anwendung in der Viewcontroller hinzuzufügen, die das Widget wieder aktivieren wird:

#import <NotificationCenter/NotificationCenter.h> 

@interface ViewController() <NCWidgetProviding> {...} 

[Check out Seite 41 der Dokumentation für Widgets https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf]

0

Der Ansatz der I gebraucht, wenn auch nicht perfekt und hat einen kleinen Rest in Notification Center, aber für mich gearbeitet:

in viewDidLoad() bis 1 bevorzugte Gehalt Größe Höhe eingestellt:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view from its nib. 
    preferredContentSize = CGSizeMake(0, 1) 
    view.setNeedsLayout() 
} 

dann, wenn Widget-Updates, tatsächliche Höhe wird und setzen Sie sich:

var data: NSData? 

func updateData() { 
    // fetch data 
    if let data = data { 
     let viewHeight: CGFloat 
     // UI preperation and initialize viewHeight var 
     preferredContentSize = CGSizeMake(0, viewHeight); 
    } else { 
     preferredContentSize = CGSizeMake(0, 1); 
    } 

} 

func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) { 
    // Perform any setup necessary in order to update the view. 

    // If an error is encountered, use NCUpdateResult.Failed 
    // If there's no update required, use NCUpdateResult.NoData 
    // If there's an update, use NCUpdateResult.NewData 

    updateData() 

    completionHandler(data != nil ? NCUpdateResult.NewData : NCUpdateResult.NoData) 
} 
Verwandte Themen