【问题标题】:tableView.selectRow(...) doesn't work when I use UIAdaptivePresentationControllerDelegate (Swift 5)当我使用 UIAdaptivePresentationControllerDelegate (Swift 5) 时 tableView.selectRow(...) 不起作用
【发布时间】:2020-11-13 11:51:36
【问题描述】:

在我的应用程序中,我使用.present(...) 在另一个视图控制器之上显示一个视图控制器(它们是相同的 VC)。当我关闭它(从屏幕下拉)时,我想在我的第一个 VC 中选择一些行。为此,我使用 UIAdaptivePresentationControllerDelegate,其中有 print(...)tableView.selectRow(...) 函数。打印工作正常,但 tableView.selectRow 不起作用。可能是什么问题?

extension UIViewController {
class func loadFromStoryboard<T: UIViewController>() -> T {
    let name = String(describing: T.self)
    let storyboard = UIStoryboard(name: name, bundle: nil)
    
    if let viewController = storyboard.instantiateInitialViewController() as? T {
        return viewController
    } else {
        fatalError("Error: No initial view controller in \(name) stroryboard")
    }
  }
}

class MyTabBarController: UITabBarController {
   let firstVC: FirstVC = FirstVC.loadFromStoryboard()
   ...
   override func viewDidLoad() {
    super.viewDidLoad()
    loadViewControllers()
   }

   private func generateViewController(rootViewController: UIViewController, image: UIImage?, title: String) -> UIViewController {
      let navigationVC = UINavigationController(rootViewController: rootViewController)
      ...
      return navigationVC
   }

   private func loadViewControllers() {
    viewControllers = [
        generateViewController(rootViewController: firstVC, image: ..., title: "...")
    ]
   }
   ...
   private func openVC() {
      let storyboard = UIStoryboard(name: "FirstVC", bundle: nil)
      let vc = storyboard.instantiateViewController(identifier: "FirstVC") as! FirstVC
      vc.presentationController?.delegate = vc
      self.present(vc, animated: true, completion: nil)
   }
   ...
}


//FirstVC
extension FirstVC: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        print("VC was dismissed")
        self.tableView.selectRow(at: IndexPath(row: 0, section: 0), animated: true, scrollPosition: .none)
    }
} 

在控制台中我看到“VC 已关闭”,但没有选择行。

附:我使用 Xcode 12.2 和 iOS 14.2。 tableView 是一个 IBOutlet,如果它很重要的话。

【问题讨论】:

    标签: ios swift delegates


    【解决方案1】:

    你应该设置:

    vc.presentationController?.delegate = self
    

    代替:

    vc.presentationController?.delegate = vc
    

    因为一旦您解雇 vc,您就会失去委托。你应该在你介绍 FirstVC 的地方听对 FirstVC 的解雇。

    如果你只是错过了,没关系。但是如果你不明白为什么我可以分享更多细节:)

    【讨论】:

    • 谢谢你的回答,但我无法将 UITabBarController 设置为委托。我在 tabBarController 中调用 openVC() 函数
    • 这是委托的逻辑。您可以添加更多类的代码吗?你从哪里调用presentationControllerDidDismiss?你的 tabbarcontroller 里面是什么?
    • 你在self.tableView.selectRow里面的self是指被解雇的FirstVC你知道吗?
    • 我没有从任何地方调用presentationControllerDidDismiss,这个方法与UIAdaptivePresentationControllerDelegate相关联,它自己工作。
    • 我的项目非常大,我无法展示课程中的所有内容。我将再次尝试解释我在做什么:我有一个 TabBarController,它有两个选项卡。我还有一个出现在 TabBarController 和其他 ViewController 之上的视图。我想做什么?例如,我在第一个选项卡(FirstVC)上,然后我打开我的视图,上面有一个按钮,我单击它并出现 FirstVC(我打开它的新副本),然后当我关闭它时FirstVC 和我希望能够更新 FirstVC 中的信息(在 TabBarController 中)。我希望我没有把你弄糊涂。
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2011-01-26
    相关资源
    最近更新 更多