Позволяет ли пользователю создать tableViewCell с текстом из другого viewController? - PullRequest
0 голосов
/ 16 октября 2018

Я создаю приложение, в котором одна из функций заключается в том, что пользователь должен иметь возможность написать имя человека и ответ на вопрос - и затем при нажатии кнопки сохранения его / ее следует снова перенаправить на предыдущий контроллер, который не создал tableViewCell с этими данными в качестве заголовка.(Позже вы можете, конечно, щелкнуть эту ячейку и просмотреть данные в третьем контроллере представления.)

Мой способ решения этой проблемы состоял в том, чтобы позволить кнопке " save " сохранить имя и ответ с помощьюиспользуя NSUserDefault.Затем одновременно подключите segue к кнопке, чтобы она перенаправила пользователя на предыдущий контроллер - и, наконец, чтобы tableView в предыдущем контроллере ссылался на вновь созданный NSUserDefault-key в поле cell.text.

У меня два вопроса.

  1. Почему это не работает?Мой код от обоих viewControllers ниже.Я не понимаю, почему это не работает.

  2. Если я заставлю это работать: как реализовать эффект, который каждый раз, когда вы вводите «Создание viewController», в котором вы можете написать имя и ответ, -пользователь получает возможность сохранить НОВОГО человека и добавить НОВУЮ ячейку вместо переопределения старой, что, боюсь, произойдет, если я получу текущий подход к работе ...

Код в « Создание viewController », где вы можете написать имя и ответ:

class CreateNewPerson: UIViewController {
let defaults = UserDefaults.standard

@IBOutlet weak var Question: UILabel!
@IBOutlet weak var ExtraIdentifier: UILabel!

@IBOutlet weak var PersonName: UITextField!
@IBOutlet weak var PersonAnswer: UITextField!
@IBOutlet weak var PersonExtraIdentifier: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
showDiaryIdentifiers () }

func showDiaryIdentifiers () {
    let DiaryQuestion = self.defaults.string(forKey: "DiaryQuestionKey")
    let ExtraIdentifer = self.defaults.string(forKey: "RandomIdentifierKey")

    self.Question.text = DiaryQuestion
    self.ExtraIdentifier.text = ExtraIdentifer
}

@IBAction func SavePerson () {
self.defaults.setValue(self.PersonName.text, forKey: "PersonNameKey")
self.defaults.setValue(self.PersonAnswer.text, forKey: "PersonAnswerKey")
self.defaults.setValue(self.PersonExtraIdentifier.text, forKey: "PersonExtraIdentiferKey")
} }

Код в другом viewController:

 class AllPersonsInYourDiary: UIViewController, UITableViewDelegate, UITableViewDataSource {

let defaults = UserDefaults.standard

@IBOutlet weak var ShowingDiaryName: UILabel!
@IBOutlet weak var ShowingDiaryQuestion: UILabel!
@IBOutlet weak var ShowingExtraIdentifer: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    showDiaryIdentifiers()

    self.navigationItem.rightBarButtonItem = self.editButtonItem
}

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

func showDiaryIdentifiers () {
    let DiaryName = self.defaults.string(forKey: "DiaryNameKey")
    let DiaryQuestion = self.defaults.string(forKey: "DiaryQuestionKey")
    let ExtraIdentifer = self.defaults.string(forKey: "RandomIdentifierKey")

    self.ShowingDiaryName.text = DiaryName
    self.ShowingDiaryQuestion.text = DiaryQuestion
    self.ShowingExtraIdentifer.text = ExtraIdentifer
}

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

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

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

    cell.textLabel?.text = self.defaults.string(forKey: "PersonNameKey")
    cell.textLabel?.numberOfLines = 0
    cell.textLabel?.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)

    return cell
}

В этом коде, я думаю, не работает метод cellForRowAt.Что я делаю не так?Сейчас он вообще не создает никаких ячеек.

Кроме того, я знаю, что я не должен возвращать 1 строку и 1 раздел.Это только сейчас.Я знаю, что должен в конце концов вернуть Something.count - но я еще не понял, что это такое ...

Спасибо!

Ответы [ 2 ]

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

Если я правильно понимаю, что вам нужно, чтобы пользователь ввел набор значений, а затем использовал эти значения для заполнения табличного представления в другом контроллере представления, то вам нужно сделать следующее: 1- создать 2 словаря, дополнительный словарь вAllPersonsInYourDiary, который будет нести новые значения и одно в вашем CreateNewPerson что-то вроде этого let dic = [[String: String]]().

2- Создайте контроллер вида:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "#yourSegueIdentifier" {
      let vc = segue.destination as! AllPersonsInYourDiary
      vc.dic = self.dic
    }
}

3- в вашем AllPersonsInYourDiary просмотреть контроллер, переопределить функции следующим образом:

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return dic.count
  }

и заполнить ячейку

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

     cell.textLabel?.text = dic[indexPath.row]["#whateverKeyForValue"]
     cell.textLabel?.numberOfLines = 0
     cell.textLabel?.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline)

     return cell
 }
0 голосов
/ 16 октября 2018

Вы уже создали табличное представление только с одной строкой.

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

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

При возврате к предыдущему контроллеру просто перезагрузите табличное представление как (Убедитесь, что перед перезагрузкой источник данных содержит новые данные.)

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