Как сохранить выбранные индексные данные ячейки табличного представления в Userdefault и использовать их в ячейке табличного представления предыдущей страницы, используя Swift? - PullRequest
0 голосов
/ 16 мая 2019

Мой сценарий, у меня есть два viewcontroller VC1 и VC2.Внутри VC1 у меня есть одно табличное представление с двумя ячейками для интерфейса перевода языка From и To.Здесь Из ячейки или В ячейку щелкните, чтобы отобразить общий список языков VC2 в виде таблицы.Основываясь на выборе языка, мне нужно сохранить данные выбора в VC1 и назначить метку ячейки табличного представления VC1 (немедленное обновление).

Ниже кода, который я использую, необходимо упростить также, как использовать сохраненные значения в VC1 вТаблица просмотра ячейки.

Здесь мой код

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        if language_segment.selectedSegmentIndex == 0 { //from

       selectedFromLanguage = filteredLanguages[indexPath.row]
            fromLanguageID = selectedFromLanguage?.icon
            fromLanguageName = selectedFromLanguage?.languageName
            fromLanguageCode = selectedFromLanguage?.languageCode

        } else { //to

            selectedToLanguage = filteredLanguages[indexPath.row]

            toLanguageName = selectedToLanguage?.icon 
            toLanguageName = selectedToLanguage?.languageName 
            toLanguageCode = selectedToLanguage?.languageCode                    
        }
        tableView.reloadData()
   }

@IBAction func close_Click(_ sender: Any) {

        // From Language Responses
        UserDefaults.standard.set(fromLanguageID ?? "",, forKey: "icon")
        UserDefaults.standard.set(fromLanguageName ?? "", forKey: "fromLanguageName")

}

1 Ответ

0 голосов
/ 17 мая 2019

Вы должны использовать модель делегата, чтобы сообщить первому VC, что язык изменился.

Вот пример.Сначала определите интерфейс делегата, например:

protocol LanguageSelectionDelegate
{
  fun languageSelector(didSetFromLanguage: Int)
  fun languageSelector(didSetToLanguage: Int)
}

Вы можете либо определить один метод, который передает оба (когда нажата кнопка OK на втором VC), либо использовать два метода, как здесь, которые вызываются, как толькопользователь щелкает опцию (которую вы используете, может зависеть от того, есть ли опция «Отмена», которая закрывает второй VC без применения изменений).

Приведите ваш первый VC в соответствие с этим протоколом и добавьте реализацию.В этой реализации вам может понадобиться только перезагрузить данные табличного представления - без кода, который я не знаю.Например (показывает только изменение языка «из», но «на» почти идентично):

class FirstVC: UITableViewController, LanguageSelectionDelegate
{
  private var fromLanguageId = UserDefaults.standard.integer(forKey: "fromLanguage")
  fun languageSelector(didSetFromLanguage languageId: Int)
  {
    UserDefaults.standard.set(languageId, forKey: "fromLanguage")
    fromLanguageId = languageId
    tableView.reloadData()
  }
}

Это предполагает, что ваша реализация cellForRowAt заполнит ячейку в соответствии с languageId.Вам необходимо сохранить ссылку на делегат во втором VC, например:

public val delegate: LanguageSelectionDelegate!

и убедиться, что вы инициализируете ее в своей первой функции prepareFor (segue) VC, например:

let vc2 = segue.destination as! SecondVC
vc2.delegate = self

Ваш didSelectRowAt для второго виртуального канала станет:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{
  tableView.deselectRow(at: indexPath, animated: true)
  if language_segment.selectedSegmentIndex == 0 
  { //from
    selectedFromLanguage = filteredLanguages[indexPath.row]
    delegate.languageSelector(didSetFromLanguage: selectedFromLanguage.id)
  } 
  else 
  { //to
    selectedToLanguage = filteredLanguages[indexPath.row]
    delegate.languageSelector(didSetToLanguage: selectedToLanguage.id)              
  }
}

Нет необходимости вызывать reloadData() из этой функции.И обратите внимание, что вам действительно нужно иметь дело только с уникальным идентификатором для языка (я предположил здесь int), а не сохранять все детали об этом.

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