iOS - 今日推广'展示更多' &安培; '显示更少'状态不正确。倒塌的说“显示更少”' - 需要多重按压来修复

时间:2017-07-29 19:58:32

标签: ios today-extension

我有一个延伸我已经取下了骨头,这使得自己处于不正确的状态,在那里它会说"显示更少"当它崩溃时。

这种情况发生在两种情况下

  1. 我使用"显示更多"扩展扩展程序然后离开 屏幕。我打开另一个应用程序,然后返回到扩展程序。 扩展的扩展在我面前明显坍塌,但仍然 说"显示更少"
  2. 我推送一个新版本来测试更改。它将从以前扩展, 当新的构建推动它变得崩溃并且表示"显示更少"
  3. 我还试图让其他扩展程序处于活动状态(天气)并展开,并且一旦展开就会一直展开,而我的扩展程序正在崩溃并显示错误的状态。

    无论天气小工具是否存在,都会发生这种情况。

    当我在代码中放置断点时,在步骤#1中再次调用ViewDidLoad。

    这里是代码,我一点一点地删除了所有内容,直到剩下这一切并仍然导致问题。

    class TodayController: UICollectionViewController, NCWidgetProviding {
    
        let reuseIdentifier = "TimeGridCell"
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
        }
    
        override func numberOfSections(in collectionView: UICollectionView) -> Int {
            return 1
        }
    
        override func collectionView(_ collectionView: UICollectionView,
                                     numberOfItemsInSection section: Int) -> Int {
            return 3
        }
    
        override func collectionView(_ collectionView: UICollectionView,
                                     cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier,
                    for: indexPath) as! ArtistTimeGridTableViewCell
            cell.nameLabel.text = "blah blah"
            return cell
        }
    
        func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
            if activeDisplayMode == .expanded {
                self.preferredContentSize = (self.collectionView?.contentSize)!
            } else if activeDisplayMode == .compact {
                self.preferredContentSize = maxSize
    
            }
        }
    }
    

    请注意,如果我删除self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded,那么我根本无法选择展开或折叠,因此需要这样做。

    这是问题的图像。第一张图片是正确的,第二张图片不正确。

    Fake expanded Fake expanded

5 个答案:

答案 0 :(得分:1)

发现另一个人谈论按钮不正常的问题,他们的解决方案似乎对我有用,虽然没有好的解释实际上有什么问题?这似乎可能是操作系统错误?

iOS10 widget "Show more" "Show less" bug

延迟设置内容大小可以防止出现问题

    let deadlineTime = DispatchTime.now() + 0.2
    if activeDisplayMode == .expanded {
        DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
            self.preferredContentSize = (self.collectionView?.contentSize)!
        }
    } else if activeDisplayMode == .compact {
        DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
            self.preferredContentSize = maxSize
        }
    }

答案 1 :(得分:0)

我遇到了完全相同的问题,但我使用布局约束来设置扩展状态的高度。对于遇到此问题的人来说,修复只是将layoutIfNeeded添加到widgetActiveDisplayModeDidChange的末尾。

使用示例:

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
    switch activeDisplayMode {
    case .compact:
        heightContstraint.constant = 0
    case .expanded:
        heightContstraint.constant = 44 * CGFloat((items.count))
    }
    view.layoutIfNeeded()
}

答案 2 :(得分:0)

刚刚找到了正确答案。

由于您允许扩展程序在 viewDidLoad 中具有扩展的大小,因此可以直接从 viewDidLoad 调用 widgetActiveDisplayModeDidChange

问题在于访问 widgetActiveDisplayModeDidChange 方法中的集合/表视图属性(大小/元素编号),因为只有在 viewWillAppear 之后才能完全初始化集合/表视图

所以,就我而言,我只是在 widgetActiveDisplayModeDidChange 中重复了 numberOfRowsInSection 计算,一切都按预期开始工作。

答案 3 :(得分:0)

在Swift 3和4中

override func viewDidLoad() {
            super.viewDidLoad()
                self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
        }

        func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
            if activeDisplayMode == .expanded {
                self.preferredContentSize = (self.myTableView?.contentSize)!
          //Instead of table content you can user user own size
            } else if activeDisplayMode == .compact {
                self.preferredContentSize = maxSize

            }
    }

答案 4 :(得分:0)

真正的问题是,在widgetActiveDisplayModeDidChange期间,collectionView尚不知道contentSize,因此它将为您提供较小的值。如果您在函数中将其打印出来,并将其与viewWillAppear进行比较,则会看到不同之处。

0.2秒的延迟似乎很棘手,所以我更喜欢这种方式:

override func viewWillAppear(_ animated: Bool) {
    if (extensionContext?.widgetActiveDisplayMode == .expanded) {
        self.preferredContentSize = self.collectionView.contentSize
    }
}

它同样适用于tableView,这是我正在使用的小部件。如果您滑过主屏幕并向后滑回,上面的代码将处理这种情况。但是,如果您仅单击显示更多/更少,则不会触发它,因此您仍然需要在widgetActiveDisplayModeDidChange中维护相同的代码。