- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面显示的项目中,有一个 InitialViewController
,它有一个标记为“Show Popover”的按钮。当点击该按钮时,应用程序应该将第二个 View Controller (PopoverViewController
) 显示为弹出窗口。第二个 View Controller 只有一个标签,上面写着“Popover!”。
如果 InitialViewController
负责实例化 PopoverViewController
,检索 popoverPresentationController
然后设置 popoverPresentationController 的 delegate
到自身(到 InitialViewController
)。您可以在下面看到结果:
但是,为了最大限度地提高可重用性,如果 InitialViewController
不需要了解有关如何委派演示 Controller 的任何信息,那就太好了。我认为 PopoverViewController
应该可以将自己设置为 popoverPresentationController 的 delegate
。我已经在 PopoverViewController
的 viewDidLoad
或 viewWillAppear
函数中试过这个。但是,PopoverViewController
在这两种情况下都是模态显示的,如下所示:
所有代码都包含在 InitialViewController
和 PopoverViewController
中。 InitialViewController
的失败 版本中使用的代码如下所示:
import UIKit
// MARK: - UIViewController subclass
class InitialViewController: UIViewController {
struct Lets {
static let storyboardName = "Main"
static let popoverStoryboardID = "Popover View Controller"
}
@IBAction func showPopoverButton(_ sender: UIButton) {
// instantiate & present the popover view controller
let storyboard = UIStoryboard(name: Lets.storyboardName,
bundle: nil )
let popoverViewController =
storyboard.instantiateViewController(withIdentifier: Lets.popoverStoryboardID )
popoverViewController.modalPresentationStyle = .popover
guard let popoverPresenter = popoverViewController.popoverPresentationController
else {
fatalError( "could not retrieve a pointer to the 'popoverPresentationController' property of popoverViewController")
}
present(popoverViewController,
animated: true,
completion: nil )
// Retrieve and configure UIPopoverPresentationController
// after presentation (per
// https://developer.apple.com/documentation/uikit/uipopoverpresentationcontroller)
popoverPresenter.permittedArrowDirections = .any
let button = sender
popoverPresenter.sourceView = button
popoverPresenter.sourceRect = button.bounds
}
}
failingPopoverViewController
中的代码如下所示:
import UIKit
// MARK: - main UIViewController subclass
class PopoverViewController: UIViewController {
// MARK: API
var factorForMarginsAroundButton: CGFloat = 1.2
// MARK: outlets and actions
@IBOutlet weak var popoverLabel: UILabel!
// MARK: lifecycle
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear( animated )
// set the preferred size for popover presentations
let labelSize =
popoverLabel.systemLayoutSizeFitting( UILayoutFittingCompressedSize )
let labelWithMargins =
CGSize(width: labelSize.width * factorForMarginsAroundButton,
height: labelSize.height * factorForMarginsAroundButton )
preferredContentSize = labelWithMargins
// set the delegate for the popoverPresentationController to self
popoverPresentationController?.delegate = self
}
}
// MARK: - UIPopoverPresentationControllerDelegate
// (inherits from protocol UIAdaptivePresentationControllerDelegate)
extension PopoverViewController: UIPopoverPresentationControllerDelegate
{
func adaptivePresentationStyle(for controller: UIPresentationController,
traitCollection: UITraitCollection)
-> UIModalPresentationStyle{
return .none
}
}
作为弹出窗口呈现的 View Controller 是否有可能成为它自己的 popoverPresentationController
的委托(delegate)?
我正在使用 Xcode 8.0、Swift 3.1,目标是 iOS 10.0
最佳答案
这当然是可能的。您正在处理时间问题。您需要在 viewWillAppear
之前设置委托(delegate)。不幸的是,没有方便的 View 生命周期函数来插入赋值,所以我改为这样做。
在您的 PopoverViewController
类中,在覆盖的 getter 中分配委托(delegate)。如果您愿意,可以使分配有条件。这创建了一种永久关系,因此其他代码永远不会通过分配委托(delegate)来“覆盖”委托(delegate)。
override var popoverPresentationController: UIPopoverPresentationController? {
get {
let ppc = super.popoverPresentationController
ppc?.delegate = self
return ppc
}
}
关于swift - 作为弹出窗口呈现的 UIViewController 可以是它自己的 popoverPresentationController 委托(delegate)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45469066/
与本文主题相同: ios13 UIPopoverViewController showing UITableViewController - Safe Area problems / Missing
我有一个UIViewController,它添加了一个UITableView、一个UISearchController。我将此 ViewController 呈现为 UIModalPresentati
我在 iOS Swift 上使用了 popoverPresentationController 并且我在 popover 中同时放置了图像和文本? 我遇到的问题是内容对于弹出框来说太大了?是否可以设置
我有一个 NavigationController,另一个 Controller 被压入其堆栈:BNRDetailsViewController。现在,在 BNRDetailsViewControll
创建了一个 SingleViewApplication,其中我放置了一个按钮。 现在单击按钮,我需要将 tableView 显示为弹出窗口。TableViewController 是在 xib 中创建
我有一个类可以在空的 swift 文件中构造 UIPopoverPresentationController: import Foundation import UIKit class Popover
我正在为 UIAlertController 设置属性,如下所示: alertController.modalPresentationStyle = .popover alertController.
我在尝试使用 popoverPresentationController 时遇到问题,基本上我有两个 View ,一个有一个 popover segue segue 到另一个。然而,第二个 View
我有一个 parent 容器 UIView,它具有三个 subview :1 个 UITextView 和 2 个按钮(按钮位于 UITextView 的顶部,但作为容器 UIView 的 subvi
我正在编写一个“笔记本”风格的程序。笔记本有多个页面,我试图放入一个“转到页面”弹出窗口以允许用户转到任何页面。弹出窗口显示每个页面缩略图的 Collection View 。显然,如果能够: 在弹出
我有一个工具栏,左下角有一个 UIBarButtomItem,标签为 Admin 我需要在点击它时显示一个弹出窗口,但它出现在错误的位置,它出现在屏幕的左上角: 这是打开弹出框的函数: // this
我正在使用新的 popOverPresentationController 在 iOS 8 中呈现 UIPopOverController。我将 popOverLayoutMargins 设置为 {6
我在 Xcode 7.3 中使用 Swift 2.2 将 Delegate 分配给 PopoverPresentationController 时遇到问题 使用委托(delegate)的原因是我试图在
我有一个在 UIViewController 中定义的弹出窗口,但现在需要从自定义 UICollectionViewCell 中呈现。 present 不再起作用,因为该类是 UICollection
我在使 UILabel 通过更改其文本颜色来对 UITextView 使用react时遇到问题。 所以当我的 UITextView 中有超过 250 个单词时,我的 UILabel 将变成红色。但由于
我在显示 UIViewController 时遇到问题,在 UITableViewController 中显示带有来自 iPhone 的弹出窗口演示文稿。我一直在使用的代码可以显示来自任何其他 UIV
我想在用户单击 iPad 中的单元格时显示一个 popoverPresentationController。这是我的代码: override func tableView(tableView: UIT
在下面显示的项目中,有一个 InitialViewController,它有一个标记为“Show Popover”的按钮。当点击该按钮时,应用程序应该将第二个 View Controller (Pop
在我将我的 View 嵌入导航 Controller 之前,这段代码工作正常 if segue.identifier == "PopupInfo" { let controller =
我有一些代码使用新的 UIAlertController 类,在 iOS 8 中工作得很好。它现在在 iOS 9 中崩溃,并显示以下错误消息: 2015-07-23 10:38:27.499 MyAp
我是一名优秀的程序员,十分优秀!