web-dev-qa-db-ja.com

Mac Catalyst:uitableViewで複数選択が機能しない

複数選択が可能なテーブルビューがあります。私は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
}
5
ohomaidi

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 に、問題を示す簡単なプロジェクトがあります。

7
WB2ISS

ここで述べたことはすべて真実ですが、この動作をハッキングする「簡単な」方法があります。以下のコードを使用すると、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
2
ph1lb4