我正在创建一个应用程序,该应用程序的功能之一是,用户应该能够写一个人的名字和问题的答案-然后按下保存按钮 >他/她应再次重定向到前一个控制器,该控制器尚未使用该数据作为标题创建tableViewCell
。 (当然,稍后您可以单击此单元格,然后在第三个viewcontroller中查看数据。)
我解决此问题的方法是让“ 保存”按钮使用NSUserDefault
保存名称和答案。然后将segue
同时连接到按钮,以使用户将用户重定向到前一个控制器-最终使前一个控制器中的tableView引用单元格中新创建的NSUserDefault-key
。文本字段。
我有两个问题。
为什么这不起作用?来自两个viewController的代码都在下面。我不明白为什么它不起作用。
如果我确实可以正常工作:如何实现这种效果,即每次输入“ Creating 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-但是我还没有弄清楚这是什么东西...
谢谢!
答案 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
}