Разрешить пользователю создавать новые tableViewCells с текстом из метки в другом viewcontroller? - PullRequest
0 голосов
/ 04 октября 2018

Итак, в viewController1 у меня есть текстовое поле и «кнопка сохранения», а когда пользователь нажимает «кнопку сохранения», текст сохраняется под меткой внизу (на том же контроллере представления).

Я не хочу, чтобы пользователь мог нажимать другую кнопку (Начать!), Которая должна привести его к следующему контроллеру представления, который является UITableViewController.Эта кнопка также должна создать новую ячейку в tableViewController - с сохраненным текстом из метки в viewController1.

Я использовал функцию «prepare (for segue:»), которая прекрасно работает для передачи данных нак следующему viewController, но по какой-то причине я могу только добавить его к метке вне ячеек tableView. Как добавить текст к метке внутри ячеек tableView?

И как мне сделатьпользователь одновременно создает новую ячейку в tableView?

В viewController1:

@IBOutlet weak var DiaryNameLabel: UILabel!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "PassingDiaryName" {
        let vc = segue.destination as! DiariesTableView
        vc.name = DiaryNameLabel.text!
    }
}

В viewController2 (tableViewController):

class DiariesTableView: UITableViewController {

@IBOutlet weak var NameLabel: UILabel!

var name:String = ""

override func viewDidLoad() {
    super.viewDidLoad()

    NameLabel.text = name
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Diary1", for: indexPath)

    cell.textLabel?.text = NameLabel.text
    return cell
}

Итак,Как я уже сказал, этот текущий код прекрасно работает для передачи текста из метки в viewController1 на UILabel, NameLabel, в следующем viewController. Но как только я установил эту метку внутри ячейки, я получаю ошибку:

Недопустимый выход NameLabel из DiariesTableView в UILabel. Розетки не могут быть подключены к повторяющемуся содержимому.

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Я думаю, что эта ошибка (" Выход NameLabel из DiariesTableView в UILabel недопустим. Розетки не могут быть подключены к повторяющемуся содержимому .") Происходит потому, что вы связываете NameLabel с UILabel в ячейке динамического tableView.Вам нужно создать подкласс UITableViewCell и связать там метку имени.Примерно так:

final class YourCell: UITableViewCell {
    @IBOutlet var nameLabel: UILabel!
}

и в cellForRow func:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Diary1", for: indexPath) as! YourCell
    cell.nameLabel.text = NameLabel.text
    return cell
}

ИЛИ, если вам не нужен динамический просмотр таблицы, вы можете использовать «Статические ячейки»: enterописание изображения здесь

Со статическими ячейками вы можете создать выход в вашем ViewController, и вам не нужно реализовывать UITableViewDataSource, просто добавьте в XCode UI Builder.Но с помощью статических ячеек вы не можете вставлять или удалять ячейки из tableView

В вашем случае вам нужно хранить массив строк где-то, что вводит пользователя:

class TextStorage {
    func save(text: String) {
        // save somewhere example NSUserDefaults or CoreData
    }

    func obtainText() -> [String] {
        // obtain saved text
    }
}

ViewContoller с текстовым полем будет выглядеть так:этот.Текст:

class ViewController: UIViewController {
    @IBOutlet var textField: UITextField!

    private let textSorage = TextStorage()

    @IBAction func done() {
        textStorage.save(text: textField.text ?? "")
        // then go to viewController with tableView
    }
}

ViewController с табличным представлением просто получите сохраненный текст из хранилища и отобразите его в tableView:

class TableViewController: UIViewController {
    @IBOutlet var tableView: UITableView!

    private let textSorage = TextStorage()
    private var savedText: [String]?

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        updateTableView()
    }

    func updateTableView() {
        savedText = textSorage.obtainText()
        tableView.reloadData()
    }
}

extension TableViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Diary1", for: indexPath) as! YourCell
        cell.nameLabel.text = NameLabel.text
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return savedText?.count ?? 0
    }
}
0 голосов
/ 04 октября 2018

Вы все неправильно поняли.Что хорошо, так как вы новичок, я полагаю.

Вот что вам нужно сделать:

Когда вы нажимаете сохранить, вам нужно сохранить текст в какой-нибудь держатель, например, массив.Затем вам нужно передать этот массив следующему контроллеру представления, где вы будете использовать его в качестве источника данных для таблицы.Если все ваши соединения в порядке, они будут отображаться на вашем столе, как и следовало ожидать.

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