isHidden或view.removeFromSuperView需要花很长时间

时间:2018-11-24 11:30:01

标签: ios swift

我试图通过按钮显示UITableView,我尝试了两种不同的方式: 从一开始就隐藏着一个UIStackView来显示,而只是以“ isHidden”来显示,另一种以另一个UIViewController的视图来显示,这被称为“ didMove(toParentViewController:self)” 通过这两种方式,tableview会立即显示,但要再次隐藏它,这将永远花费。 我尝试将“ isHidden = true”放入“ DispatchQueue.main.sync”中以使用主线程,但仍无法按我希望的方式工作...

有什么建议吗?

这是我的应用程序的一些代码:

@IBAction func ProfilPicture1Pressed(_ sender: UIButton) {

    let popUpTeamDog = storyboard?.instantiateViewController(withIdentifier: "selectTeamDogPopUp") as! SelectTeamDogPopUp
    DispatchQueue.global().async(execute: {
        DispatchQueue.main.sync{
            self.addChildViewController(popUpTeamDog)
            popUpTeamDog.view.frame = self.view.frame
            self.view.addSubview(popUpTeamDog.view)
            popUpTeamDog.didMove(toParentViewController: self)
        }
    })


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let dog: Dog

    if(searching){
        dog = searchArray[indexPath.row]
    } else {
        dog = dogs[indexPath.row]
    }

    let nameDog = dog.name
    //let imgDog = UIImage(named: dog.image)


    print(nameDog)
    DispatchQueue.global().async(execute: {
        DispatchQueue.main.sync{
            self.view.removeFromSuperview()
        }
    })

因此,我可以添加一点,当我单击searchBar,然后选择一条狗时,tableView / View会立即消失,因此,当键盘被激活时,效果很好...奇怪的事情。...

1 个答案:

答案 0 :(得分:2)

默认情况下,您的代码使用主线程。因此,您不必使用此DispatchQueue.global()DispatchQueue.main。太慢了。

所以替换掉这个

DispatchQueue.global().async(execute: {
    DispatchQueue.main.sync{
        self.addChildViewController(popUpTeamDog)
        popUpTeamDog.view.frame = self.view.frame
        self.view.addSubview(popUpTeamDog.view)
        popUpTeamDog.didMove(toParentViewController: self)
    }
})

使用

self.addChildViewController(popUpTeamDog)
popUpTeamDog.view.frame = self.view.frame
self.view.addSubview(popUpTeamDog.view)
popUpTeamDog.didMove(toParentViewController: self)

,然后对self.view.removeFromSuperview()执行相同的操作。取代这个

DispatchQueue.global().async(execute: {
    DispatchQueue.main.sync{
        self.view.removeFromSuperview()
    }
})

self.view.removeFromSuperview()