我的情况是,我有两个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")
}
答案 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),而不是保存有关它的所有详细信息。