【问题标题】:Swift array inside struct only appends once how can it append again a separate time?结构内的 Swift 数组只追加一次,它怎么能再次追加一次?
【发布时间】: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 操作,它就起作用了。

标签: arrays swift struct


【解决方案1】:

作为参考,我设法找出了问题所在。我能够将tableView.reloadData() 添加到视图控制器中的@IBAction func saveNewData,就像这样。

@IBAction func saveNewData(_ segue: UIStoryboardSegue) {
    if segue.sourceViewController is AddBookCategoryViewController {

        print("saveNewData")
        tableView.reloadData()
    }
}

谢谢。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 2017-03-14
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2021-12-06
    • 2019-08-20
    相关资源
    最近更新 更多