【问题标题】:TableView reload from Segue not working in Swift 3从 Segue 重新加载的 TableView 在 Swift 3 中不起作用
【发布时间】:2016-10-01 07:31:49
【问题描述】:

在 Swift v3 中,我的 TableView 不会在 segue 时重新加载。我很确定这段代码在 2.0 中工作。

@IBAction func unwindToLevelListView(_ segue: UIStoryboardSegue)
{
    print("RELOADING VIEW")
    TableView.reloadData()
}

RELOADING VIEW 打印,但 TableView 不重新加载。我也试过把这段代码放在 ViewDidLoad 和 ViewDidAppear 中,但是这些都不起作用。

附:需要注意的是,这些行也不会在显示时重新加载(即向下滚动然后向上滚动)。

非常感谢您的帮助。

代码如下:

override func viewDidAppear(_ animated: Bool)
{
    TableView.reloadData()
}

// Create Table
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "LevelSelected", for: indexPath) as! LevelListCell

    // Set labels
    cell.levelNameLabel.text = "LEVEL " + String(puzzleLevels[(indexPath as NSIndexPath).row])
    let unlocked: Bool = puzzleUnlocked[(indexPath as NSIndexPath).row]

    if(challengeSelected == 1 && (indexPath as NSIndexPath).row == 0 && puzzleUnlocked[1] == false)
    {
        cell.levelStatusLabel.text = "Not Solved"
    }
    else if(unlocked == true)
    {
        cell.levelStatusLabel.text = "Solved"
    }
    else
    {
        cell.levelStatusLabel.text = "Not Solved"
    }

    // Set color
    cell.levelNameLabel.textColor = UIColor.white
    cell.levelStatusLabel.textColor = UIColor.white

    if unlocked == false
    {
        cell.backgroundColor = UIColor.lightGray
        // Uncomment to disable interaction
        // cell.userInteractionEnabled = false // Comment Out to Remove Lock
    }
    else if unlocked == true
    {
        cell.backgroundColor = UIColor(red: 0, green: 64, blue: 128, alpha: 0.0)
        cell.isUserInteractionEnabled = true
    }

    return cell
}

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    levelSelected = (indexPath as NSIndexPath).row

    self.performSegue(withIdentifier: "LevelSelected", sender: levelSelected);
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if (segue.identifier == "LevelSelected")
    {
        if let nextViewController = (segue.destination as? GameViewController)
        {
            nextViewController.selectedLevel = levelSelected
            nextViewController.selectedChallenge = challengeSelected
        }
        print("List View Level Selected:\(levelSelected)")
    }
}

@IBAction func unwindToLevelListView(_ segue: UIStoryboardSegue)
{
    print("RELOADING VIEW")
    TableView.reloadData()
}

【问题讨论】:

  • 您是否为 tableview 设置了插座/使用了 tableviewcontroller? reloadData() 重新加载那些可见的行,在 segue 期间,还没有可见的行。这就是为什么它没有被调用。尝试将 self.tableView.reload() 设置为“viewDidApprear” - 这必须工作。如果它不起作用,那么您的代码还有一些问题。在这种情况下,请提供代码来填充您的 tableView
  • 谢谢。我在 viewDidAppear 中添加了它,不幸的是它仍然没有显示。提供 tableView 的代码。重新加载之外的所有其他功能都可以正常工作。

标签: swift tableview reloaddata


【解决方案1】:
NotificationCenter.default.addObserver(self, selector:"reloadData", name:
NSNotification.Name(rawValue: "reloadTableView"), object: nil)

func reloadData(){
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            print("Work SO !!")
            self.tableView.reloadData()
        }
}

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "reloadTableView"), object: nil)

【讨论】:

  • 今晚我会试试这个。谢谢你。它不应该不需要延迟计时器吗?
  • 这就是我在我的 tableVIew 中使用的......也许你可以删除延迟计时器。你需要进入 viewDidLoad(),
  • 不幸的是,这不起作用。我已经在我能想到的任何地方都加载了它,并且还使用了延迟。您认为这可能与领域负载有关吗?
  • 谢谢。这是变量没有在 segue 时被重置。重新加载从 segue 开始,但必须重置变量才能使 tableView 显示更新的更改。你是对的,只要变量也设置好了,你的代码就可以工作。
【解决方案2】:

感谢您的回复。我能够弄清楚发生了什么。进行 segue 时最重要的是确保重新建立价值观。

@IBAction func unwindToLevelListView(_ segue: UIStoryboardSegue)
{
    print("RELOADING VIEW")
    let getLevels = Level(challengeNumber: challengeSelected, gameSelected: gameSelected)
    puzzleLevels = getLevels.puzzleLevels
    puzzleUnlocked = getLevels.unlocked
    tableView.reloadData()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多