#ios #swift #uitableview
#iOS #swift #uitableview
Вопрос:
У меня есть ячейка табличного представления, в которой я использую таблицу действий для изменения языка приложения. После того, как действие произошло, я хочу изменить отображаемое название языка. Как я могу получить доступ к этой ячейке? Могу ли я использовать индексы для вызова и редактирования заголовка кнопки для этой ячейки??
let actionSheet = UIAlertController(title:NSLocalizedString("Message", comment: "Message"), message:"", preferredStyle:.actionSheet)
//
actionSheet.addAction(UIAlertAction(title:"English", style:.default, handler: { (action) in
Bundle.setLanguage("en")
self.navigationController?.dismiss(animated:true, completion:nil)
self.languageSelected.text = "English"
self.cell.notificationButton.setTitle("English" , for: .normal )
self.lang = 0
self.langChange()
////////////////////////////////////////////////
func langChange() {
if lang == 0 {
cell.notificationButton.setTitle("English" , for: .normal )}
if lang == 1 {
cell.notificationButton.setTitle("Hindi" , for: .normal )}
if lang == 2 {
cell.notificationButton.setTitle("Tamil" , for: .normal )}
if lang == 3 {
cell.notificationButton.setTitle("Telugu" , for: .normal )}
}
////////////////////////////////////////
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! AppSettingViewCell
cell.selectionStyle = .none
cell.leftText.text = menuArray[indexPath.row]
cell.isUserInteractionEnabled = true
if lang == 0 {
cell.notificationButton.setTitle("English" , for: .normal )}
if lang == 1 {
cell.notificationButton.setTitle("Hindi" , for: .normal )}
if lang == 2 {
cell.notificationButton.setTitle("Tamil" , for: .normal )}
if lang == 3 {
cell.notificationButton.setTitle("Telugu" , for: .normal )}
if indexPath.row == 0 {
cell.notificationButton = UIButton()
cell.languageLabel = UILabel()
cell.addSubview(cell.notificationButton)
cell.addSubview(cell.languageLabel)
languageSelected.textColor = appGreenTheme
cell.languageLabel.text = languageSelected.text
cell.languageLabel.textColor = appGreenTheme
cell.languageLabel.isHidden = true
cell.notificationButton.setTitleColor(appGreenTheme, for: .normal)
cell.notificationButton.isHidden = false
..
Я пытался изменить это с помощью множества методов, но заголовок в первой ячейке не меняется. Пожалуйста, кто-нибудь может помочь?
Комментарии:
1. Здравствуйте, откуда вы представляете таблицу действий?
2. таблица действий отображается, когда пользователь нажимает на самую первую ячейку tableview, которая представляет собой вкладку настроек языка
3. Не могли бы вы, пожалуйста, поделиться скриншотом представления выходной таблицы.
4. конечно, сделал. надеюсь, это поможет
5. Скажите мне, какой заголовок notificationButton вы хотите изменить, нажимая опцию action sheet
Ответ №1:
В вашем конкретном случае, поскольку ваше изменение не требует изменения макета ячейки (под изменением макета я подразумеваю отсутствие вычисления высоты, связанного с изменением ячейки), вы можете использовать следующее
....
self.languageSelected.text = "English"
self.cell.notificationButton.setTitle("English" , for: .normal )
self.lang = 0
self.langChange()
let cell = YOUR_TABLEVIEW_REF.cellForRow(at: IndexPath(row: YOUR_ROW_FOR_LANGUAGE_CELL, section: YOUR_SECTION_FOR_LANGUAGE_CELL)) as! AppSettingViewCell
// REST OF YOUR LOGIC TO CHANGE THE CELL CONTENT BASED ON YOUR IMPLEMENTATION.
cellForRow(at indexPath: IndexPath)
захватит ячейку, которая в данный момент отображается в заданном indexPath. Когда вы нажимаете на ячейку и показываете таблицу действий, становится довольно ясно, что ячейка в данный момент визуализируется. Вызов cellForRow(at indexPath: IndexPath)
вернет вам эту ячейку.
Комментарии:
1. Хотя технически ваш ответ верен, в нем отсутствует одна важная информация — если OP не сохранит данные где-либо (какая-то модель), они вернутся к исходному значению после прокрутки tableview настолько, чтобы ячейка использовалась повторно.
2. я не могу вызвать это из таблицы действий. cellforrow at не является appsettingcell не является его членом. также, если я вызову из метода tableview cellforrow at, он не будет обновляться после изменения настроек
3. Да, вы правы, OP должен сохранять статус текущего языка, я предполагаю, что OP уже прочитал текущий установленный язык из постоянного хранилища в
cellForRow
источнике данных tableview.4. я думаю, вы говорите о доступе к
tableview
ссылке внутриUIAlertAction
, верно?
Ответ №2:
Похоже, что вы сохраняете свою UITableViewCell
во вложенном классе и пытаетесь изменить ее с помощью этой ссылки. Я не уверен, сработает ли это, но я знаю, что это не рекомендуемый способ изменения вашей ячейки.
Вместо этого вам следует изменить язык в cellForRowAt()
функции, как вы уже пытаетесь сделать. Чего не хватает, так это того, что при langChange()
вызове функции просто нужно знать вашу UITableView
и вызывать reloadData()
:
func langChange() {
tableView.reloadData()
}
Почему это работает?
reloadData()
заставляет таблицу перезагрузить все свои ячейки, поскольку она считает, что набор данных, на котором она основана, изменился. На этом этапе cellForRowAt()
вызывается снова для каждой отображаемой в данный момент ячейки. Внутри cellForRowAt()
теперь вы проверите, какой язык выбран, и установите заголовок ячейки в соответствии с языком.
Ответ №3:
Насколько я понимаю, вы хотите изменить заголовок, который будет отображаться в таблице действий после изменения языка в указанной ячейке, верно? Если это так, попробуйте использовать делегат.
Пример: В вашем классе cell создайте функцию или @IBAction, чтобы открыть ее таблицу действий в главном представлении и передать ее ячейку в качестве параметра, когда ваше главное представление получит свой параметр (ячейку), используйте TableView.indexPath (для: ячейки параметра), чтобы он предоставил вам конкретный indexPath ячейки, которая открыла свою таблицу действий, и через нее вы измените заголовок