gpt4 book ai didi

iOS 使用 xib + 全局方法覆盖 UIView (Swift)

转载 作者:可可西里 更新时间:2023-11-01 01:42:35 24 4
gpt4 key购买 nike

我正在编写一个应在特定情况下显示叠加层的应用,例如,该应用缺少启用的定位服务。

Overlay 是一个带有 UIImageView(背景)、UILabel(标题)和调用特定操作的 UIButton 的 UIView。我想使用 Interface Builder 来设置覆盖 UI,但我想调用覆盖并在不同的 UIViewController 上显示它,具体取决于何时检测到缺少位置服务。

我已经设置了一个自定义类(UIView 的子类)来链接一个 xib 文件。代码如下:

class LaunchCustomScreen: UIView
{

@IBOutlet var title: UILabel!
@IBOutlet var enableLocationButton: UIButton!
@IBOutlet var waitingIndicator: UIActivityIndicatorView!
@IBOutlet var bckgroundImage: UIImageView!

func setupDefault()
{
title.text = "Location Services Required"
enableLocationButton.setTitle("Enable Location Services", forState: UIControlState.Normal)
enableLocationButton.addTarget(self,
action: "promptUserForLocation",
forControlEvents: UIControlEvents.TouchUpInside)

hideLocButton()
}

func hideLocButton()
{
enableLocationButton.hidden = true
}

func showLocButton()
{
enableLocationButton.hidden = false
}
}

然后我创建了属于 LaunchCustomScreen 类的 xib 文件,并将 IBOutlets 链接到其中的所有对象(UILabels、UIBUtton、UIImageView)

然后我设置了一些全局函数,以便从任何其他 UIViewController 调用,以便显示/隐藏特定 View Controller 上的叠加层,并将其配置为隐藏或可见的 UIButton(当用户定位时,它将通过等待指示器隐藏)仍在加载)。相关代码如下:

func setupLaunchDefault(vc: UIViewController) -> LaunchCustomScreen
{
for aSubview in vc.view.subviews
{
if aSubview.isKindOfClass(LaunchCustomScreen)
{
NSLog("Found already a launch screen. Removing")
aSubview.removeFromSuperview()
}
}

var screen: LaunchCustomScreen = LaunchCustomScreen()
screen.setupDefault()
return screen
}

func showLaunchAskLocation(vc:UIViewController)
{
var screen = setupLaunchDefault(vc)
screen.bounds = vc.view.bounds
screen.showLocButton()
vc.view.addSubview(screen)
}

现在我正在尝试该解决方案是否有效并且它在 setupLaunchDefault 函数上崩溃。原因是即使创建了 LaunchCustomSCreen 的实例,变量 (title, enableLocationButton) 仍然是 nil。我虽然他们应该是非零感谢 IBOutlet 到 xib ......我错过了什么?

预先感谢您的帮助!

最佳答案

I have set up a custom class (subclass of UIView) to link a xib file

不,你没有。不可能有这样的“链接”。

what am I missing?

您不会遗漏任何东西,因为您已经弄明白了!

只是凭空创建一个 LaunchCustomScreen 实例(即像您一样说 LaunchCustomScreen())只是创建此类的一个实例。它与 .xib (nib) 文件没有任何关系!类和 Nib 之间没有任何神奇的“联系”!因此,没有任何事情会导致这些属性获得任何值。正如您正确解释的那样,它们是 nil

您已经在 nib 中设计并配置了 LaunchCustomScreen 的一个特殊实例 是 socket 连接的实例,在同一个 Nib 内。因此,如果您想要一个带有连接 socket 的 LaunchCustomScreen 实例,您必须加载 nib!加载 nib 完全等同于生成 nib 中内容的实例 - 它一种实例化形式。而这里,就是你想要的实例化形式,因为这个实例就是你想要的实例。

所以,答案是:不要LaunchCustomScreen() 来获取您的 LaunchCustomScreen 实例 (screen)。相反,加载 nib 以获取您的 LaunchCustomScreen 实例 - 一切都会好起来的。

那么,假设您的 .xib 文件名为 LaunchCustomScreen.xib。你会说:

let arr = NSBundle.mainBundle().loadNibNamed("LaunchCustomScreen", owner: nil, options: nil)
let screen = arr[0] as UIView

第一个结果 arr 是从 nib 实例化的顶级对象数组。这些对象中的第一个(可能是数组的唯一成员)就是您所追求的 View !因此,您将其转换为 UIView 并准备好将其粘贴到您的界面中。由于 View 来自 Nib ,因此设置了它的导出,这就是您所追求的。您可以根据需要多次执行此操作,以获得此 View 的任意数量的“副本”。

关于iOS 使用 xib + 全局方法覆盖 UIView (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28095307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com