Как обновить UITableViewCell информацией из подробного представления?

#ios

#iOS

Вопрос:

Я разрабатываю приложение и хочу, чтобы оно выглядело как страница настроек на iOS:

введите описание изображения здесь

Поведение, которое я хочу воспроизвести, — это поведение, найденное в ячейках «От / до» и «Разрешить вызовы из». Если вы заметили, в этих ячейках отображаются данные, вставленные пользователем. Как я могу это повторить?

Прежде всего, я довольно новичок в iOS, поэтому все, что я придумал, может быть не лучшим решением для моего случая.

Это то, о чем я думал (добавление метки справа и установка ее значения):

введите описание изображения здесь

Это лучший подход? Кроме того, как мне установить это значение? Как мне поступить после того, как пользователь вернулся из подробного представления, чтобы обновить эту ячейку?

Комментарии:

1. Что вы знаете о UITablevIews повторном UITableViewCells использовании и сохранении данных в iOS?

2. @Adeel ну, я знаю о повторном использовании ячеек (я использую эту технику). Что касается сохранения данных, я использую SQLite. Но в этом случае меня беспокоит только сохранение данных между представлениями, о которых я ничего не знаю, поэтому мой второй вопрос How should I go by after the user returned from the detail view to update that cell? Спасибо!

3. Есть два способа обновить ячейку, когда пользователь возвращается из подробного представления. 1) Protocols 2) Notifications . Я бы посоветовал вам выбрать первый вариант. Кстати, какой язык вы используете?

4. Всякий раз, когда значение изменяется в подробном представлении, вы можете уведомить предыдущее представление об этом изменении с помощью protocol метода или notification .

5. @Adeel спасибо 🙂 На самом деле я использую Xamarin.iOS, но вы можете привести мне пример в swift, и я смогу его перевести 🙂

Ответ №1:

По сути, вы хотите обновить содержимое в предыдущем представлении (мы называем его FirstViewController ), когда какое-либо значение изменяется в подробном представлении. Один из возможных способов сделать это — через Protocols and Delegates . Предполагая, что вы уже знаете о storyboards и segues вот пример. Этот пример просто изменяет текст a UILabel в FirstViewController при нажатии кнопки в DetailViewController .

Давайте начнем с DetailViewController . Вы хотите наблюдать за изменениями в этой сцене и соответствующим образом обновлять данные в другой сцене. Итак, вам нужно определить протокол в этом классе.

 protocol DetailDelegate {
    func updateCellWith(_ data:String)
}
 

Полное определение этого класса будет выглядеть следующим образом:

 import UIKit

protocol DetailDelegate {
    func updateCellWith(_ data:String)
}

class DetailViewController: UIViewController {

var delegate: DetailDelegate?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

//On button tap the cell content will change in the previous scene through the delegate method
@IBAction func didTapBtn(_ sender: AnyObject) {
    delegate?.updateCellWith("Cell updated")
}
}
 

FirstViewController Будет delegate из DetailViewController и будет соответствовать DetailDelegate . Вы установите в FromViewController качестве делегата DetailViewController перед переходом.

 class FirstViewController: UIViewController, DetailDelegate {

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

// Mark Navigation

@IBAction func moveToDetailVC(_ sender: AnyObject) {
    performSegue(withIdentifier: "detail", sender: indexPath)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination as! DetailViewController
    vc.delegate = self
}
}
 

При нажатии на кнопку DetailViewController будет передана строка Cell updated в FirstViewController метод делегирования updateCellWith: .

Комментарии:

1. С удовольствием 🙂.