複数選択が可能なテーブルビューがあります。私はviewDidLoadでallowsMultipleSelectionとallowsMultipleSelectionDuringEditingの両方をtrueに設定しており、これはiOSとiPadOSの両方で完全に機能しています。今日、Catalystを試してみることにしました。このビューで複数の行を選択できないことを除いて、アプリは美しく見えます。何か案は?以下がそのコードです。よろしくお願いします。
//複数選択を許可
override func viewDidLoad()
{
super.viewDidLoad()
self.tableView.allowsMultipleSelection = true
self.tableView.allowsMultipleSelectionDuringEditing = true
.....
}
//選択を7行に制限する
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if let selectedItems = tableView.indexPathsForSelectedRows {
if selectedItems.count > 6 {
return nil
}
}
return indexPath
}
@IBAction func doneButtonTapped(_ sender: UIBarButtonItem) {
...
let selectedIndexPaths = tableView.indexPathsForSelectedRows
if !selectedIndexPaths!.isEmpty {
for index in selectedIndexPaths! {
let selectedProcedure = fetchedResultsController?.object(at: index) as! Item
...
Rest of code to perform the required task
}
MacOS Catalystでの複数選択は、iOSおよびiPadOSでの場合とまったく同じようには機能せず、これはバグであるか、意図された動作の残念な選択のようです。
MacOS Catalystでは、tableView.allowsMultipleSelectionDuringEditingをtrueに設定して編集モードで複数選択を有効にした場合、ポインターをクリックして直接選択できるのは、一度に1行だけです。ただし、連続する行の複数選択は、最初の行を選択してからShiftキーを押しながら2番目の行を選択することで有効になり、隣接しない行の複数選択は、最初の行を選択してからCOMMANDキーを押しながら追加の行を選択することで有効になります。これは、MacOSで複数選択が一般的に機能する方法であるという点で、Macのような動作です。したがって、これは意図された動作であった可能性があります。しかし、それが事実である場合、それは発見するのが難しい動作であり、iOS/iPadOSユーザーが期待するものではなく、iOSおよびiPadOSとは異なる動作をします。そして、それは他の問題を引き起こします-たとえば、コードにはiOS/iPadOSのコードからすべての行を選択できる「すべて選択」関数があり、このコードはmacOS Catalystでは機能しません。
これについてフィードバックを提出しました。 GitHubの WB2ISS/MultipleSelection に、問題を示す簡単なプロジェクトがあります。
ここで述べたことはすべて真実ですが、この動作をハッキングする「簡単な」方法があります。以下のコードを使用すると、MacでもiOS/iPadOSと同じ動作になります
#if targetEnvironment(macCatalyst)
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if let selectedRows = tableView.indexPathsForSelectedRows, selectedRows.contains(indexPath) {
tableView.deselectRow(at: indexPath, animated: false)
return nil
}
return indexPath
}
func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? {
if let selectedRows = tableView.indexPathsForSelectedRows, selectedRows.contains(indexPath) {
return nil
}
return indexPath
}
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
// the mac sets isHighlighted of each other cell to false before selecting them again which leads to a flickering of the selection. Therefore go through the selected cells and highlight them here manually
tableView.indexPathsForSelectedRows?.forEach { tableView.cellForRow(at: $0)?.isHighlighted = true }
return true
}
#endif