【问题标题】:How to pass data in array from one vc to another?如何将数组中的数据从一个vc传递到另一个?
【发布时间】:2020-10-02 16:37:50
【问题描述】:

我在从一个 vc (它是表视图控制器,我有来自类别的新闻)传递数组数据时遇到了麻烦。我将这些类别放入数组中,然后对这个数组进行排序以获得唯一元素,并将这个排序后的数组(包含大约 7 个类别)传递给另一个视图控制器。

我有什么:我创建了条形按钮项“Filter”并为此按钮创建了一个动作,称为“filterButtonTapped”。内部操作我调用了方法排序数组并调用了 pushViewController

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

//this is sortedArray
var categories: [String]?

//this is sorting method 
func sortingArray() {
        var arrayOfAllCategories = [""]
        if let  rssItems = rssItems {
        for item in rssItems {
            //print(item.category)
            arrayOfAllCategories.append(item.category)

        }
        arrayOfAllCategories.remove(at: 0)
        categories = arrayOfAllCategories.unique
        }
    }

}

//this is IBAction 
 @IBAction func filterButtonTapped(_ sender: UIBarButtonItem) {
        sortingArray()
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let secondVC = storyboard.instantiateViewController(withIdentifier: "FilterViewController") as! FilterViewController
        secondVC.arrayOfcategories = categories ?? [""]  
        self.navigationController?.pushViewController(secondVC, animated: true)
        print("filter button tapped")

    }

问题是 在第二个视图控制器中,这个类别数组出现(我打印它并查看结果),但单元格显然没有看到这个数据,因为这个表视图在启动应用程序后是空的,当我点击按钮时也没有任何反应:

class FilterViewController: UITableViewController {

var arrayOfcategories: [String]? 

override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.reloadData()
        print(arrayOfcategories)  //this print prints array in the console 
    }

 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return arrayOfcategories?.count ?? 0

    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CategoryCell", for: indexPath) as! FilterCell
        let category = arrayOfcategories?[indexPath.row]

        cell.categoryLabel.text = category

        return cell    
    }



}

我做错了什么?如何传递这个数组并用它来填充单元格?

【问题讨论】:

  • 听起来您正确地传递了数组。您更有可能没有在viewDidLoad() 方法中设置表格视图数据源和委托。从头开始,您正在继承 UITableViewController,而不是 UIViewController,所以这不是问题。
  • 能否在tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 中设置断点并确保它被调用?
  • 实际上我已经设置了一个断点并且它没有被调用。所有这些 tableViewDelegate 方法都没有被调用
  • 他们可能拼错了?这是经常发生的事情,尤其是如果您只是复制并粘贴代码。
  • 我写了一个像这样 ["1", "2", "3"] 的 mockArray 并将它放在数据源方法中,并且这个数组不显示... :(

标签: ios arrays swift uitableview


【解决方案1】:

尝试添加这些方法:注册 Nib(如果您以编程方式创建了单元格)并尝试传递第 1 节的编号:

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(FilterCell.self, forCellReuseIdentifier: "CategoryCell")
        self.tableView.reloadData()
        print(arrayOfcategories)  //this print prints array in the console 
    }

   override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

【讨论】:

    【解决方案2】:

    更新:您似乎没有在此处注册 UITableViewCell,如果您以编程方式创建了单元格,请将此行添加到 viewDidLoad(如果您使用的是 nib,则使用 nib 参数注册单元格):

    tableView.register(FilterCell.self, forCellReuseIdentifier: "CategoryCell")
    

    arrayOfcategories 添加一个观察者,当它设置为将您的数据重新加载到UITableView 时,如下所示:

    var arrayOfcategories: [String]? {
        didSet {
            tableView.reloadData()
        }
    }
    

    【讨论】:

    • 不幸的是,它没有帮助解决问题:(无论如何谢谢!
    • 你能调试一下吗?在didSet 中添加一个打印出arrayOfcategories 的打印件,然后告诉我你得到了什么。由于您也在许多其他地方打印它,因此请确保您仅从didSet print 获取输出。
    • 我已经删除了所有打印并在 didSet 中只调用了一个,并且我已经用实际数据填充了数组,例如: Optional(["Medicine\n ", "Sport\n", “人\n”、“经济\n”、“世界\n”、“高科技\n”])
    • 你查看我的更新了吗?但是缺少寄存器应该会导致崩溃。可以确认 cellForRow 现在是否被调用。
    猜你喜欢
    • 2020-03-15
    • 2020-09-18
    • 1970-01-01
    • 2017-12-10
    • 2019-11-06
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多