允许用户使用来自另一个viewController的文本创建tableViewCell吗?

时间:2018-10-16 10:57:11

标签: ios swift uitableview nsuserdefaults

我正在创建一个应用程序,该应用程序的功能之一是,用户应该能够写一个人的名字和问题的答案-然后按下保存按钮 >他/她应再次重定向到前一个控制器,该控制器尚未使用该数据作为标题创建tableViewCell。 (当然,稍后您可以单击此单元格,然后在第三个viewcontroller中查看数据。)

我解决此问题的方法是让“ 保存”按钮使用NSUserDefault保存名称和答案。然后将segue同时连接到按钮,以使用户将用户重定向到前一个控制器-最终使前一个控制器中的tableView引用单元格中新创建的NSUserDefault-key。文本字段。

我有两个问题。

  
      
  1. 为什么这不起作用?来自两个viewController的代码都在下面。我不明白为什么它不起作用。

  2.   
  3. 如果我确实可以正常工作:如何实现这种效果,即每次输入“ Creating viewController”时,您都可以在其中输入名称和答案-用户可以选择保存一个新的人并添加一个新的单元格,而不是覆盖旧的单元格,如果我采用当前的工作方法,恐怕会发生这种情况...

  4.   

正在创建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 :(得分:0)

您已经创建了仅包含一行的表格视图。

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

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

返回到以前的控制器时,只需重新加载tableview之类的(确保在重新加载数据源之前已包含新数据。)

tableView.reloadData()

答案 1 :(得分:0)

如果我正确理解您需要用户输入一组值,然后使用这些值在另一个视图控制器中填充表格视图,那么您想要做的是: 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
 }