【发布时间】:2016-08-10 03:17:23
【问题描述】:
我正在制作一个应用程序来加载用户可以添加到表格中的书籍和书籍类别列表。我创建了一个结构来组织数据。当用户想要添加新书或类别时,它会弹出我的AddBookCategoryViewController。当我尝试添加类别时,它成功地将类别加载为标题标题。但是,当我尝试添加第二个类别时,它不会第二次添加它。它不会产生任何错误,它会贯穿整个prepareForSegue。我完全不知道如何弄清楚。
注意:我没有尝试一次添加两个类别,我尝试成功添加一个(我可以),然后点击添加按钮尝试添加第二个。
谢谢。
这是我的ViewController 代码:
class ViewController: UITableViewController {
var testArray = [Category]()
var sections: [Category] = CategoryData().getCategoryFromData()
@IBAction func editButton(_ sender: UIBarButtonItem) {
self.isEditing = !self.isEditing
}
@IBAction func addButton(_ sender: UIBarButtonItem) {
}
@IBAction func saveNewData(_ segue: UIStoryboardSegue) {
if segue.sourceViewController is AddBookCategoryViewController {
print("saveNewData")
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func numberOfSections(in tableView: UITableView) -> Int {
return testArray.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return testArray[section].sectionItems!.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "bookList", for: indexPath)
cell.textLabel?.text = testArray[indexPath.section].sectionItems?[indexPath.row]
cell.detailTextLabel?.text = ""
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(sections[indexPath.section].sectionItems?[indexPath.row])
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return testArray[section].sectionHeading
}
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
let header = view as? UITableViewHeaderFooterView
header?.textLabel?.textColor = UIColor.orange()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
这里是 AddBookCategoryViewController:
import UIKit
class AddBookCategoryViewController: UIViewController {
var data: Category?
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBAction func cancelButton(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var pickCategory: UIButton!
@IBAction func segmentedChangeFields(_ sender: AnyObject) {
if segmentedControl.selectedSegmentIndex == 0 {
nameLabel.text = "Name of Book"
authorLabel.text = "Author"
authorLabel.isHidden = false
authorTextField.isHidden = false
pickCategory.isHidden = false
}
else {
nameLabel.text = "Name of Category"
authorLabel.isHidden = true
authorTextField.isHidden = true
pickCategory.isHidden = true
categoryLabel.isHidden = true
}
}
@IBOutlet weak var categoryLabel: UILabel!
@IBOutlet weak var authorTextField: UITextField!
@IBOutlet weak var authorLabel: UILabel!
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "saveNewData" {
let vc = segue.destinationViewController as! ViewController
print("1")
if segmentedControl.selectedSegmentIndex == 0 {
print("2")
} else {
print("3")
vc.testArray.append(Category(sectionHeading: nameTextField.text!, sectionItems: []))
}
}
print("4")
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
【问题讨论】:
-
确定:没有办法为第二次segue做准备?方法不再被调用?
-
抱歉耽搁了。我相信是这样,因为一切都按原样打印到日志中。在做了一些修补之后,我实际上想通了。一旦我将 tableView.reloadData() 添加到 saveNewData 操作,它就起作用了。