如何将tableview单元格选定的索引数据存储到Userdefault中,并使用Swift将其用于上一页tableview单元格中?

时间:2019-05-16 14:05:33

标签: swift

我的情况是,我有两个ViewController VC1和VC2。在VC1内部,我有一个带有两个单元格的tableview,分别用于From和To翻译语言UI。 在“从单元格”或“到单元格”中,单击以在表格视图中显示常见的VC2语言列表。基于语言选择,我需要将选择数据存储到VC1,并需要分配VC1表格单元格标签(立即更新)。

在我正在使用的代码下面,还需要简化如何在tableview单元格中使用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 :(得分:0)

您应该使用委托模型来通知第一个VC语言已更改。

这是一个例子。首先定义一个委托接口,例如:

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

您可以定义同时传递两种​​方法的单个方法(在第二个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!

并确保在第一个VC prepareFor(segue)函数中将其初始化,例如:

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

您用于第二个VC的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()。请注意,您实际上只需要为该语言处理一个唯一的ID(我在这里假设一个int),而不是保存有关它的所有详细信息。