Оставьте хотя бы одну строку, выбранную в UITableView - PullRequest
0 голосов
/ 10 марта 2019

Привет, есть UITableView, в котором есть возможность отмечать / снимать флажки с каждой строки.Он работает должным образом, нет, я хочу убедиться, что выбран хотя бы один ряд, и когда пользователь пытается снять флажок, показать ему предупреждение о том, что должен быть выбран хотя бы один вариант.Как я могу это реализовать?

Это текущий код

private var locationToDisplay = [Location]();
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.dataSource=self
    self.tableView.delegate=self
    self.tableView.allowsMultipleSelection = true
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return locationToDisplay.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SubscriptionCell", for: indexPath) as! SubscriptionTableViewCell
    let cellLocation = locationToDisplay[indexPath.row]
    cell.labelLocation.text = cellLocation.location_name

    if cellLocation.subscribed == 1 {
        self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    } else {
        self.tableView.deselectRow(at: indexPath, animated: false)
    }
    return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       locationToDisplay[indexPath.row].subscribed = 1
}

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if (countSelections()==1) {
        //Last checked item
    }

       locationToDisplay[indexPath.row].subscribed = 0
}

func countSelections()->Int {
    var count: Int = 0
    for location in locationToDisplay {
        if (location.subscribed == 1) {
            count = count + 1
        }
    }
    return count
}

Ответы [ 3 ]

0 голосов
/ 10 марта 2019

Вы можете воспользоваться методом willDeselectRowAt UITableViewDelegate следующим образом:

func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? {
    guard tableView.indexPathsForSelectedRows?.count ?? 0 == 1 else { return indexPath}

    let alertController = UIAlertController(title: "Error", message: "You must keep at least one cell selected", preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
    self.present(alertController, animated: true, completion: nil)

    return nil
}
0 голосов
/ 10 марта 2019

В вашей реализации didDeselect пользователь может проверить не более одной ячейки.
Вы можете проверить, выбрана ли эта строка, отмените выбор: (поскольку didDeselect срабатывает автоматически)

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if (countSelections()==1) {
        //Last checked item
    }
    if (locationToDisplay[indexPath.row].subscribed == 1) {
       locationToDisplay[indexPath.row].subscribed = 0
    }
}

Также выможете удалить это переопределение и обработать выделение и отмена выбора ячейки в didSelect.

И вы можете проверить, что вы хотите следующим образом:

сначала вы должны проверить, есть ли первыйвыбранный элемент или нет (объявите его в viewDidLoad): firstTime = true

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if (!firstTime) {
        if (countSelections() > 1) {
            if (locationToDisplay[indexPath.row].subscribed == 1) {
                locationToDisplay[indexPath.row].subscribed = 0
            } else {
                locationToDisplay[indexPath.row].subscribed = 1
            }
        }
    } else {
      locationToDisplay[indexPath.row].subscribed = 1
      firstTime = false
    }
}

Кроме того, я думаю, что лучший способ - позволить пользователю отменить выбор всего и проверить количество выборок в кнопке, которая делает просмотр видадругому.

0 голосов
/ 10 марта 2019

Посмотрите на метод делегата func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?.Здесь вы можете вернуть nil, если вы не хотите, чтобы пользователь на самом деле отменил выбор строки (и затем вы также можете показать предупреждение).

(Кроме того, вы не должны звонить self.tableView.selectRow или self.tableView.deselectRow изнутри cellForRowAt метод. Проверьте https://stackoverflow.com/a/13827975/403425 для получения дополнительной помощи.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...