8

未解決の macOS 10.13 のバグをいくつか修正しようとしているときに、既存のアプリで問題が発生しました。カレンダー アプリの小さな月間カレンダーに似た小さな NSCollectionView があります。日付を表示し、クリックすると縦にスクロールします。ただし、macOS 10.13 では、コレクション ビューは数行しか表示されず、スクロールしません。データ ソースが正しく呼び出され、追加の項目を読み込もうとすることを確認しましたが、スクロールしません。

この問題を示す小さなサンプル アプリケーションを作成しました。これは、メイン ストーリーボードを介して NSCollectionView を追加し、nib から読み込まれた汎用 NSCollectionViewItem クラスを持つ基本的な macOS アプリです。メイン ビュー コントローラーのコード全体は次のとおりです。

- (void)viewDidLoad {  
  [super viewDidLoad];  

  NSNib *nib = [[NSNib alloc] initWithNibNamed:@"FooCollectionViewItem" bundle:nil];  
  [self.collectionView registerNib:nib forItemWithIdentifier:@"foo"];  
}  
- (void)viewDidAppear {  
  [super viewDidAppear];  

  [self.collectionView reloadData];  
}  
- (void)setRepresentedObject:(id)representedObject {  
  [super setRepresentedObject:representedObject];  

}  
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView {  
  return 1;  
}  
- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {  
  return 2000;  
}  
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath {  
  FooCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"foo" forIndexPath:indexPath];  
  item.fooField.stringValue = [NSString stringWithFormat:@"%ld", indexPath.item];  

  return item;  
}

結果のアプリは次のようになります。

ここに画像の説明を入力

残念ながら、それは完全にコレクション ビューです。スクロールしても、追加のアイテムはスクロールされません。サンプル アプリをhttps://www.dropbox.com/sh/wp2y7g0suemzcs1/AABVKfTZq54J7riy6BR7Mhxha?dl=0にアップロードしました。これが10.13で壊れている理由はありますか?

4

6 に答える 6

1

macOS 10.14 でも同様の問題がありました。で選択を設定するための呼び出しがありました-viewDidLoad

[self.collectionView selectItemsAtIndexPaths:[NSSet setWithCollectionViewIndexPath: indexPath] scrollPosition:NSCollectionViewScrollPositionNone];

これにより、レイアウトが壊れました。この呼び出しを に移動することで問題を解決できました-viewWillAppear

于 2019-10-24T08:21:45.040 に答える
0

私の macOS Mojave 10.14.4 では、Xcode 10.2 を使用して、カスタム NSWindowController をアプリに追加するまで NSCollectionView はスクロールしませんでした。ここにある Ray Wenderlich チュートリアルから次の viewDidLoad を借りましたhttps://www.raywenderlich.com/783-nscollectionview-tutorial。なぜ機能するのかわかりませんが、機能します。

override func windowDidLoad() {
    super.windowDidLoad()
    if let window = window, let screen = NSScreen.main {
        let screenRect = screen.visibleFrame
        window.setFrame(NSRect(x: screenRect.origin.x, y: screenRect.origin.y, width: screenRect.width/2.0, height: screenRect.height), display: true)
    }
}
于 2019-04-13T14:17:06.293 に答える