【问题标题】:How to access width and height of a UIView from another class?如何从另一个类访问 UIView 的宽度和高度?
【发布时间】:2019-06-19 22:59:20
【问题描述】:

我正在使用 UIPresentationController 制作自定义动画。我正在努力做到这一点,以便当按下按钮转到下一个视图控制器时,呈现的视图控制器占用了前一个视图控制器中一个 UIView 的宽度。我需要帮助的是如何从我的 UIPresentationController 类中访问 UIView 的宽度和高度。

在视图控制器中:

@IBOutlet weak var buttonView: UIView!

func width() -> CGFloat {
    return buttonView.frame.size.width
}

func height() -> CGFloat {
    return buttonView.frame.size.height
}

在演示控制器中:

override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize {

    let vc = ViewController()
    return CGSize(width: vc.width(), height: vc.height())
}

我目前遇到的错误是,当我返回 buttonView.frame.size.width 或 buttonView.frame.width 时,它意外返回 nil 作为可选值。但是,宽度不是可选值,如果我打印出来也不会返回 nil。它不允许我访问要在视图控制器范围之外使用的变量。任何帮助表示赞赏。

【问题讨论】:

标签: ios swift


【解决方案1】:

即使你初始化了视图控制器,按钮的 iboutlet 还没有被初始化。因此,当您调用 width 函数时,您正在访问 nil 以获取非可选属性。加载笔尖时初始化 Iboutlets。

这是从另一个视图控制器访问视图的方法..

call IBOutlet UIButton from one class to another Viewcontroller

【讨论】:

  • 感谢您的回复!那么你需要做什么来加载笔尖呢?那只是在加载视图时吗?另外,初始化是指在实例化 vc 对象时吗?此外,如果这有什么不同,“let vc = ViewController()”代码会在 ViewController 的视图已经加载后调用,因为它正准备转换到下一个视图控制器(与 buttonView 大小相同的视图控制器)
  • Nibs 在调用它们对应的 VC 的 awakeFromNib() 方法时被加载。 “let vc = ViewController()”正在创建 vc 对象的新实例。即使您当前的 ViewController 的视图已加载,您也创建了一个新的 viewController 并使用新实例化的 viewController 来访问未初始化的按钮。
  • 哦,有道理。我查看了您的链接,但我仍然对如何初始化插座感到有些困惑。使用 CAPSPageMenuDelegate 看起来我只能从函数 willMoveToPage() 中的另一个类访问出口。但是,我需要在演示控制器的 func size() 中访问它。您知道仍然能够做到这一点的解决方法吗?
  • 您需要使用演示控制器中的按钮引用 vc。
  • 感谢您的帮助。我想到了。在我的 PresentationController 中,我通过情节提要 id 实例化了视图控制器。然后我访问 vc 中的一个属性,该属性具有一个返回视图宽度的 getter。在 getter 中,我在 return 语句之前有一个 if 语句,检查视图是否已加载,如果未加载,则我使用 loadView() 加载视图。这样,视图的宽度就不会是 nil 值,因为从技术上讲,视图将在幕后加载。
【解决方案2】:

在 UIPresentationController 的子类中,您可以执行以下操作:

if let myVc = presentingViewController as? MyCustomVc {
    let myViewWidth = myVc.myCustomView.frame.width
}

【讨论】:

  • 感谢您的回复。我最终做的是通过 Storyboard ID 在我的 UIPresentationController 子类中实例化 vc(让 vc: ViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController") as!ViewController)。我认为可选绑定也可以,所以谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多