1

iOS 14 の新機能でUICollectionViewCompositionalLayout.list、NSDiffableDataSourceSectionSnapshot を使用して、リストの自動アウトラインタイプを作成できます。Apple は WWDC ビデオでこれを示しており、それを示す Modern Collection Views というサンプル コード プロジェクトもあります。

でもやってみるとうまくいかない。ルート アイテムが表示されますが、タップしても展開されません。なぜだめですか?

Apple のコードをコピーして自分のプロジェクトに貼り付けても、この問題が発生します。わかりません。まったく同じコードが Apple のプロジェクトでは機能しますが、私のプロジェクトでは機能しません。

完全に再現可能な例を次に示します。これはプロジェクトのコード全体です。何が悪いのか教えてください!

アプリ デリゲート

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
}

シーンデリゲート

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let scene = scene as! UIWindowScene
        self.window = UIWindow(windowScene: scene)
        self.window!.rootViewController = CollectionViewController()
        self.window!.makeKeyAndVisible()
    }
}

ビューコントローラー

import UIKit

class CollectionViewController: UICollectionViewController {
    init() {
        let config = UICollectionLayoutListConfiguration(appearance: .plain)
        let layout = UICollectionViewCompositionalLayout.list(using: config)
        super.init(collectionViewLayout: layout)
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
    private let cellId = "Cell"
    
    var dataSource: UICollectionViewDiffableDataSource<String, String>! = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.collectionView.register(UICollectionViewListCell.self, forCellWithReuseIdentifier: self.cellId)
        
        let ds = UICollectionViewDiffableDataSource<String, String>(collectionView:self.collectionView) { cv, ip, s in
            let cell = cv.dequeueReusableCell(withReuseIdentifier: self.cellId, for: ip) as! UICollectionViewListCell
            var contentConfig = cell.defaultContentConfiguration()
            contentConfig.text = s
            if ip.item == 0 {
                let opts = UICellAccessory.OutlineDisclosureOptions(style: .header)
                cell.accessories = [.outlineDisclosure(options: opts)]
            } else {
                cell.accessories = []
            }
            cell.contentConfiguration = contentConfig
            return cell
        }
        self.dataSource = ds
        
        var snap = NSDiffableDataSourceSectionSnapshot<String>()
        snap.append(["Pep"], to: nil)
        snap.append(["Manny", "Moe", "Jack"], to: "Pep")
        self.dataSource.apply(snap, to: "Dummy", animatingDifferences: false, completion: nil)
    }
}
4

1 に答える 1

0

編集Xcode 12 ベータ 4 で修正されました。元の例は正常に動作するようになりました。

ビューコントローラーは問題ありません。あなたはすべてを正しくやっています。

問題は、シーン デリゲートの次の行です。

self.window!.rootViewController = CollectionViewController()

完全にあいまいな理由により (Apple はこれについてどこにも言及していません)、この機能はナビゲーション コントローラー インターフェイスでのみ機能します。その行を次のように変更します。

self.window!.rootViewController = UINavigationController(rootViewController: CollectionViewController())

アウトラインが生き返ります。

ここに画像の説明を入力

于 2020-07-27T21:57:56.027 に答える