【问题标题】:How to bring up a xib as a "pop up" in a ViewController?如何在 ViewController 中将 xib 作为“弹出窗口”调出?
【发布时间】:2017-03-12 17:52:50
【问题描述】:

我在 Xcode 中设计了一个不错的登录框作为 xib 文件,当用户在我的应用程序的登录页面上点击“登录”时,我希望登录框弹出并让他们输入他们的信息.

目前虽然我很难让它显示出来,因为这是我第一次使用 xibs。任何帮助,将不胜感激。似乎我的 IBAction 没有连接,因为我做了第二个类,它断开了登录按钮与 IBAction 的连接。不知道如何解决这个问题。

提前致谢!在 Xcode 上使用 Swift 3 和最新版本。

import UIKit

class AuthMainViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.isHidden = true
}
}

class loginClass: UIView {

class func instanceFromNib() -> UIView {
    return UINib(nibName: "LoginView.xib", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}

@IBAction func loginBtnTapped(_ sender: Any) {
    let loginView = loginClass.instanceFromNib()
    self.addSubview(loginView)
    print("Login got pressed")
}
}

【问题讨论】:

  • 作为替代方案,您可以将另一个视图添加到您的 ViewController 并更改 alpha 值以将其显示为弹出窗口。它工作得很好。对你来说还不够吗?此外,您可以使用 cocoapods.org/pods/DialogView 之类的 Cocoa 库

标签: ios swift swift3 interface-builder xib


【解决方案1】:

接受答案的问题是,in 只处理视图本身,这不足以保持 UIKit 完全正常运行。 为了拥有功能齐全的 UIViewController,你应该使用这个:

//adding UIViewController to another UIViewController:
addChildViewController(viewController)
view.addSubview(viewController.view)
viewController.view.frame = view.bounds
viewController.didMove(toParentViewController: self)

//removing UIViewController from another UIViewController:
viewController.willMove(toParentViewController: nil)
viewController.view.removeFromSuperview()
viewController.removeFromParentViewController()

如果没有其他方法,您可能会发现许多方面的故障,例如:

  • 外观方法
  • 轮换方法
  • 过渡方法
  • 响应链
  • 导航控制器、标签栏控制器属性

参考: https://developer.apple.com/reference/uikit/uiviewcontroller

“实现一个容器视图控制器”

在将子视图控制器添加到视图层次结构之前,您的容器视图控制器必须将子视图控制器与其自身关联

【讨论】:

    【解决方案2】:

    在您的项目中,弹出式控制器是 UIViewController 的子类,您可以使用几个方法来添加视图,如下所示:

    self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController", bundle: nil)
    self.view.addSubview(popViewController)
    

    Pop up window in SwiftAdding a subview using a XIB and Storyboard的创建方法可以参考教程

    【讨论】:

    • 成功了!当你回答时,我实际上正在调查。谢谢。
    • 但是要小心!!! - 这个答案不应该被接受 - 它并没有完全解决问题。这将使很多事情不起作用,因为它只负责添加视图本身,而不是 UIViewController。在这里,外观方法、旋转方法和其他一些方法将不起作用。我将单独发布正确答案。
    • @Grzegorz krukowski 正如你所说的有关如何添加视图的所有详细信息以及在提供的链接中解释的所有方法。你能不能说我的回答是错误的。
    • @SiddheshMhatre 我在上面的回答中做的,很难做评论
    【解决方案3】:

    这才是你真正想要的。

    主要我们可以使用自定义.xib来加载自定义UITableViewCell, UICollectionViewCell和自定义PopUp

    1. 将自定义 .xib 加载为 UITableViewCell

    像这样创建一对自定义 .xib 及其类文件。(例如 CustomCell.SwiftCustomCell.xib

    • 转到项目导航器并右键单击创建名为CustomCell 的新类,子类为UITableViewCell

    • 转到项目导航器并创建具有相同类名的新 .xib 文件

    新建文件.. -> 用户界面 -> 查看 -> 保存为您的类名“CustomCell” -> 创建

    • 现在您将获得带有 UIView 子类的 .xib 文件,但我们需要一个 UITableViewCell 那么我们该怎么办?我们删除那个 UIView 文件并添加一个UITableViewCell 并给出类名CustomCell 和标识符。 (Command + Shift + L) UITableView 并根据您的项目要求拖放到 xib 窗口和设计单元格。

    • 现在我们将移动到代码部分并在 ViewContoller 类文件中初始化 .xib 并将其加载到 UITableView 中。

    • 我们将从我们的包中获取单元格,并将单元格注册到 UITableView。

    UITableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")

    • 使用此配置并加载cellForRowAt indexPath 中的单元格

    let cell : CustomCell = self.(YourTableView).dequeueReusableCell(withIdentifier: "CustomCell") as! CustomCell return cell

    1. 将自定义 .xib 加载为UICollectionViewCell

    注意:重复上述步骤,将UITableViewCell替换为UICollectionViewCell并像这样注册UICollectionViewCell

    self.collectionView.register(UINib(nibName: "CollectoinCustCell", bundle: nil), forCellWithReuseIdentifier: "CollectoinCustCell")

    • 使用此配置并加载cellForRowAt indexPath 中的单元格

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell : CollectoinCustCell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectoinCustCell", forIndexPath: indexPath) as! CollectoinCustCell return cell }

    • 自定义视图作为弹出窗口(以上述问题的适当答案结束)

    • 创建一对 xib 文件,此时您不必从 .xib 文件中删除 UIView。

    • 从您的捆绑包中获取 xib,例如:

    • let CustomXIB = Bundle.main.loadNibNamed("CustomXIB", owner: nil, options: nil)?.first as? CustomXIB

    • viewWillAppear中定义你的xib文件的框架

    • CustomXIB?.frame = UIScreen.main.bounds

    创建 appDelegate 实例文件以在主窗口中添加 xib 文件:您的 AppDelegate 将如下所示。

    var AppInstance: AppDelegate! @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { AppInstance = self } }

    • 并将您的 customXIB 添加到一些 IBAction 上,例如:

    AppInstance.window?.addSubview(self.CustomXIB!)

    • 删除 CustomXIB 喜欢

    self.CustomXIB?.removeFromSuperview()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      相关资源
      最近更新 更多