2016-11-30 2 views
0

Я внедрил сегодня виджет для отображения недавно записанных видео thumb.i использую коллекцию в файле Stidboard Widget. Все работает нормально. Я могу получить требуемые большие пальцы из общего контейнера и привязать его к коллекции. Теперь проблема: каждый раз, когда я ищу виджет в Центре уведомлений, он вызывает ViewDidLoad из TodayWidgetViewController каждый раз. Из-за этого просмотр коллекции, кажется, перезагружается каждый раз.ViewDid Нагрузка сегодня Виджет получает вызов каждый раз

Есть ли способ предотвратить перезагрузку каждый раз?

Заранее спасибо.

Ниже приведен исходный код Реализовано:

{

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

}

ответ

0

viewWillAppear и viewDidAppear будет вызываться каждый раз, когда отображается виджет.

О viewDidLoad кажется странным, вы уверены в этом? В любом случае это не должно произойти, это не нормально, попробуйте проверить этот метод:

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

Ваше расширение, вероятно, имеет ошибку и просматривать каждый раз, когда появляется она вызывается снова.

Надеюсь, это поможет.


Update: (после ваших исправлений)

Кажется, ваш крах виджет или не загружается из-за проблем размера. В viewWillAppear попытаться запустить этот метод:

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

даже я удивляюсь, почему viewdidLoad становится вызывается каждый раз. и это проблема для меня. и я также реализовал вышеописанный метод. – hpp

+0

Прочитайте мою фразу под моим кодом, есть определенная ошибка, которая заставляет перезагружать ваш виджет, вы должны его найти. У вас нет кода для записи в вашем вопросе, поэтому я не могу не исправить его, но вы должны работать, чтобы найти эту ошибку: я думаю, что это хороший способ. –

+0

Я добавил код. Вы можете проверить и сообщить мне, что с ним не так? – hpp

Смежные вопросы