【问题标题】:outlet nil even though in the same controller出口为零,即使在同一个控制器中
【发布时间】:2018-06-26 13:13:42
【问题描述】:

我有一个带有子视图的导航栏视图控制器,我正在尝试从子视图调用此函数

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


    selectedFavour = FavoursDataSet[indexPath.row].id

    subviewviewcontrollername = "FavourView"

    let storyboard: UIStoryboard =
        UIStoryboard.init(name: "Main",bundle: nil);

    let tabViewController: TabViewController = storyboard.instantiateViewController(withIdentifier: "TabView") as! TabViewController;
    wassubview = true

    tabViewController.showsubviewsubs()



}

调用showsubviewssub()函数就是这个函数

@IBOutlet var thecontentView: UIView!




func showsubviewsubs(){

    let previousVC = viewControllers[selectedIndex]

    previousVC.willMove(toParentViewController: nil)
    previousVC.view.removeFromSuperview()
    previousVC.removeFromParentViewController()

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    subviewviewcontroller = storyboard.instantiateViewController(withIdentifier:"HomeView")

    let vc = subviewviewcontroller

    self.addChildViewController(vc!)
    vc?.view.frame = thecontentView.bounds
    thecontentView.addSubview((vc?.view)!)

    vc?.didMove(toParentViewController: self)

}

问题是 contentView 出口(调用此函数的子视图已经在其中)返回 nil,即使我是从该 Viewcontroller 调用它

【问题讨论】:

    标签: swift function uiview uiviewcontroller outlet


    【解决方案1】:

    此时不会设置 IBOutlets。您应该将showsubviewsubs 的调用移动到“HomeView”视图控制器本身,因为此时您可以保证一切都已设置完毕。

    这样做也是一种更好的做法,因为这样您就不必依赖视图控制器外部的东西来负责完成设置。

    【讨论】:

    • 此时应设置 IBOutlets,因为该函数是从在“thecontentview”插座中查看的子视图调用的,我只是试图加载不同的子视图,但无法在相同的控制器,因为它是通过选择子视图控制器上的一个单元格来完成的
    • 您在本地 tabViewController 变量中创建视图控制器的新实例,然后立即调用其 showsubviewsubs 方法。您尚未将视图控制器视图添加到任何内容,因此没有设置任何内容。
    • 但是它的工作原理是到达这个区域我必须点击一个页面来加载tabviewcontroller然后在其中子视图另一个控制器,然后当你点击它需要的子视图控制器中的一个单元格要在已经填充的 tabviewcontroller 中加载另一个子视图,在单元格之前已经填充了 contentview
    • 哦,我明白了,因为我再次加载了导航控制器,所以当 homeview 加载后,它可以被 subviewed 到 contentview 中?
    • 但该函数中的 tabViewController 不是原始的,它是您创建的全新的。这样做let tabViewController: TabViewController = storyboard.instantiateViewController(withIdentifier: "TabView") as! TabViewController; 创建了一个全新的视图控制器副本,它不引用任何当前存在的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多