ViewDid Загрузка сегодняшнего виджета вызывается каждый раз

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

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

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

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

{

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

}

1 ответ

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

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

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

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

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


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

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

func setPreferredContentSize() {
        var currentSize: CGSize = self.preferredContentSize
        currentSize.height = 190.0
        self.preferredContentSize = currentSize
}
Другие вопросы по тегам