2016-11-30 5 views
0

Ich habe heute Widget für die Anzeige kürzlich aufgenommener Videos thumb.i bin Sammlung Ansicht in Widget Storyboard-Datei implementiert. Alles funktioniert gut. Ich bin in der Lage, erforderliche Thumbs aus dem freigegebenen Container zu erhalten und sie ebenfalls an die Sammlungsansicht zu binden. Jetzt ist das Problem Immer, wenn ich nach dem Widget in der Mitteilungszentrale suche, ruft es jedes Mal ViewDidLoad von TodayWidgetViewController an. Aus diesem Grund scheint die Ansicht jedes Mal neu geladen zu werden.ViewDid Load von heute Widget wird jedes Mal aufgerufen

Gibt es eine Möglichkeit, zu verhindern, dass jedes Mal neu geladen wird?

Vielen Dank im Voraus.

Unten ist der Source Code implementiert:

{

@IBOutlet weak var widgetCollection: UICollectionView! 
@IBOutlet weak var recordButton: UIButton! 

var mutArryListOfVideosImg: NSMutableArray = NSMutableArray() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view from its nib. 

    self.recordButton.layer.borderWidth = 2.0 
    self.recordButton.layer.borderColor = UIColor.white.cgColor 
    self.recordButton.layer.masksToBounds = true 
    self.recordButton.layer.cornerRadius = self.recordButton.frame.size.width/2 

    self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded 

    //print("array count:\()") 

} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    self.getVideoThumbImages() 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func btnRecordAction(sender:UIButton) 
{ 
    let pjUrl = URL(string: "") 
    self.extensionContext?.open(pjUrl!, completionHandler: { (Bool) in 

    }) 
} 


func getDataPath() -> URL 
{ 
    let appGroupId = “” 

    let appGroupDirectoryPath:URL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupId)! 

    let newDirectory = appGroupDirectoryPath.appendingPathComponent("VideoThumbs") 

    return newDirectory 

} 

func getVideoThumbImages() 
{ 

    let videoDirectoryPath = self.getDataPath() 

     if let Images = try? FileManager.default.contentsOfDirectory(atPath: videoDirectoryPath.path) as [String] 
     { 
     if((Images.count) > 0) 
     { 
      let sortedImages = (Images.sorted(by: backward)) as [String] 

      //print("Sorted Array:\(sortedImages)") 

      if((sortedImages.count) > 0) 
      { 
       for (index,element) in (sortedImages.enumerated()) { 
        print("\(index) = \(element)") 

        mutArryListOfVideosImg.add(element) 

       } 

       if(mutArryListOfVideosImg.count > 0) 
       { 
        widgetCollection.reloadData() 
       } 
      } 
     } 
    } 

} 

func backward(_ s1: String, _ s2: String) -> Bool { 
    return s1 > s2 
} 

func getDataFromUrl(url: URL, completion: @escaping (_ data: Data?, _ response: URLResponse?, _ error: Error?) -> Void) { 
    URLSession.shared.dataTask(with: url) { 
     (data, response, error) in 
     completion(data, response, error) 
     }.resume() 
} 

//MARK: CollectionView Delegate and Datasource 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
{ 
    if mutArryListOfVideosImg.count > 3 
    { 
     return 3 
    } 
    else 
    { 
     return mutArryListOfVideosImg.count 
    } 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
{ 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "WidgetCollectionCell", for: indexPath as IndexPath) as! WidgetCollectionCell 
    cell.imgVideoThumbImage.layer.cornerRadius = 8.0 
    cell.imgVideoThumbImage.layer.masksToBounds = true 

    let directoryPath = self.getDataPath() 

    let url = directoryPath.appendingPathComponent(mutArryListOfVideosImg.object(at: indexPath.item) as! String) 

    getDataFromUrl(url: url) { (data, response, error) in 
     guard let data = data, error == nil else { return } 
     //print(response?.suggestedFilename ?? url.lastPathComponent) 
     //print("Download Finished") 

     DispatchQueue.main.async() {() -> Void in 
      cell.imgVideoThumbImage.image = UIImage(data: data) 
     } 
    } 

    return cell 
} 

public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
{ 
    print("Widget thumb tapped....") 

    let pjUrl = URL(string: “CallBack://edit-\(mutArryListOfVideosImg.object(at: indexPath.item))") 
    self.extensionContext?.open(pjUrl!, completionHandler: { (Bool) in 

    }) 

} 

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
{ 
    return CGSize(width: (self.widgetCollection.frame.size.width/3) - 10, height: 70) 
} 

func widgetPerformUpdate(completionHandler: (@escaping (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 

    completionHandler(NCUpdateResult.newData) 
} 

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) { 
    if (activeDisplayMode == NCWidgetDisplayMode.compact) { 
     self.preferredContentSize = maxSize 
    } 
    else { 
     self.preferredContentSize = CGSize(width: maxSize.width, height: 120) 
    } 
} 

}

Antwort

0

viewWillAppear und viewDidAppear wird jedes Mal, wenn Ihr Widget angezeigt wird, aufgerufen werden.

Über viewDidLoad scheint seltsam, bist du dir sicher? Auf jeden Fall sollte dies nicht passieren, es nicht normal ist, versuchen Sie, diese Methode zu überprüfen:

func widgetPerformUpdate(completionHandler: ((NCUpdateResult) -> Void)) { 
     // you could call here a custom function to update your widget 
     completionHandler(NCUpdateResult.NewData) 
} 

Ihre Erweiterung hat wahrscheinlich einen Fehler und jedes Mal Ansicht scheint es wieder aufgerufen wird.

Ich hoffe, es hilft.


Update: (nach Ihren Korrekturen)

Scheint Ihr Widget Absturz oder nicht aufgrund der Größe Probleme geladen. In viewWillAppear versuchen, diese Methode zu starten:

func setPreferredContentSize() { 
     var currentSize: CGSize = self.preferredContentSize 
     currentSize.height = 190.0 
     self.preferredContentSize = currentSize 
} 
+0

auch ich frage mich, warum viewDidLoad jedes Mal aufgerufen zu werden. und das ist das Problem für mich. und ich habe oben genannte Methode auch implementiert. – hpp

+0

Lies meinen Satz unter meinem Code, es gibt sicherlich einen Fehler, der das Nachladen deines Widgets erzwingt, du musst es finden. Sie haben keinen Code in Ihrer Frage geschrieben, so kann ich nicht helfen, es zu korrigieren, aber Sie müssen arbeiten, um diesen Fehler zu finden: Ich denke, das ist der gute Weg .. –

+0

Ich habe Code hinzugefügt. Sie können überprüfen und lassen Sie mich wissen, was ist los damit? – hpp

Verwandte Themen