FloatingPanel 没有出现 - Swift Xcode
Posted
技术标签:
【中文标题】FloatingPanel 没有出现 - Swift Xcode【英文标题】:FloatingPanel not appearing - Swift Xcode 【发布时间】:2021-06-10 21:21:43 【问题描述】:我有一个包含表格视图的视图控制器。在这个视图控制器中,我还设置了一个浮动面板。但是,由于某种原因,浮动面板没有出现。我知道 ContentViewController 正在工作,所以我没有包含该代码。错误在此代码中的某处,我找不到它。这就像 FloatingPanel 只是没有被添加到视图中。
import Foundation
import UIKit
import FloatingPanel
class Section
let title: String
let options: [String]
var isOpened: Bool = false
init(title: String,
options: [String],
isOpened: Bool
)
self.title = title
self.options = options
self.isOpened = isOpened
class PicsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UINavigationControllerDelegate, FloatingPanelControllerDelegate
@IBOutlet weak var addButton: UIButton!
private let picsTableView: UITableView =
let picsTableView = UITableView()
picsTableView.register(UITableViewCell.self,
forCellReuseIdentifier: "cell")
return picsTableView
()
private var sections = [Section]()
let backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
/*------------START FLOATING PANEL-------------*/
var fpc: FloatingPanelController!
override func viewDidLoad()
super.viewDidLoad()
print("PicsViewController LAUNCHED!!")
fpc = FloatingPanelController()
fpc.delegate = self
// guard let contentVC = storyboard?.instantiateViewController(identifier: "fpc_content") as? ContentViewController else
// print("Failed to instantiate storyboard")
// return
//
let contentVC = ContentViewController()
fpc.set(contentViewController: contentVC)
// fpc.track(scrollView: contentVC.collectionView)
fpc.addPanel(toParent: self)
/*------------END FLOATING PANEL-------------*/
// Set up models
picsTableView.delegate = self
picsTableView.dataSource = self
picsTableView.frame = view.bounds
picsTableView.backgroundColor = backgroundColor
view.addSubview(picsTableView)
sections = [
Section(title: "Section 1", options: ["Test 1", "Test 2", "Test 3"], isOpened: false),
Section(title: "Section 2", options: ["Test 1", "Test 2", "Test 3"], isOpened: false),
Section(title: "Section 3", options: ["Test 1", "Test 2", "Test 3"], isOpened: false),
Section(title: "Section 4", options: ["Test 1", "Test 2", "Test 3"], isOpened: false)
]
// get rid of extra table view cells
picsTableView.tableFooterView = UIView()
// customize button
addButton.layer.cornerRadius = 0.5 * addButton.bounds.size.width
addButton.clipsToBounds = true
addButton.backgroundColor = .red
addButton.tintColor = .white
addButton.setImage(#imageLiteral(resourceName: "plus-5-512"), for: .normal)
view.bringSubviewToFront(addButton)
@IBAction func addButtonTapped(_ sender: Any)
print("Add button tapped")
func numberOfSections(in tableView: UITableView) -> Int
return sections.count
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
let section = sections[section]
if section.isOpened
return section.options.count + 1
else
return 1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = picsTableView.dequeueReusableCell(
withIdentifier: "cell",
for: indexPath
)
cell.backgroundColor = .clear
cell.textLabel?.textColor = .black
if indexPath.row == 0
cell.textLabel?.text = sections[indexPath.section].title
else
cell.textLabel?.text = sections[indexPath.section].options[indexPath.row - 1]
return cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
picsTableView.deselectRow(at: indexPath, animated: true)
if indexPath.row == 0
sections[indexPath.section].isOpened = !sections[indexPath.section].isOpened
picsTableView.reloadSections([indexPath.section], with: .none)
else
print("Tapped sub cell \(indexPath.row)")
【问题讨论】:
您尝试过我发布的答案吗?它奏效了吗?你还有什么问题吗? 【参考方案1】:通常,将任何视图控制器作为子视图添加到任何视图控制器的 3 或 4 个语句是
let viewController = SomeViewController()
self.addChild(viewController)
self.view.addSubview(viewController.view)
viewController.didMove(toParent: self)
因为你没有提供你调用fpc.addPanel(toParent: self)
的addPanel
的实现,我假设它的功能类似于我上面写的,如果我要写它,我可能会写类似
func addPanel(toParent: UIViewController)
toParent.addChild(self)
toParent.view.addSubview(self.view)
//add constraints or set frames for your subview
self.didMove(toParent: toParent)
最后,您要向视图控制器的视图添加多个视图,即浮动面板、tableView 和一个按钮。因为您在添加所有其他视图之前添加面板,它可能隐藏在其他子视图下,如 tableView
,您显然可以使用视图调试器检查这个假设,最简单的修复方法是使用 bringSubviewToFront
,但问题是你没有持有FloatingPanelController
视图的引用,因此您可以尝试添加self.view.bringSubviewToFront(fpc.view)
作为ViewDidLoad
的最后一条语句
override func viewDidLoad()
super.viewDidLoad()
// all other codes of yours
self.view.bringSubviewToFront(fpc.view)
如果这不起作用,请调用 fpc.addPanel(toParent: self)
作为 ViewDidLoad
的最后一条语句,而不是在两者之间添加并添加 bringSubviewToFront
作为 addPanel(toParent
方法的最后一条语句
override func viewDidLoad()
super.viewDidLoad()
print("PicsViewController LAUNCHED!!")
fpc = FloatingPanelController()
fpc.delegate = self
let contentVC = ContentViewController()
fpc.set(contentViewController: contentVC)
picsTableView.delegate = self
picsTableView.dataSource = self
picsTableView.frame = view.bounds
picsTableView.backgroundColor = backgroundColor
view.addSubview(picsTableView)
sections = [
Section(title: "Section 1", options: ["Test 1", "Test 2", "Test 3"], isOpened: false),
Section(title: "Section 2", options: ["Test 1", "Test 2", "Test 3"], isOpened: false),
Section(title: "Section 3", options: ["Test 1", "Test 2", "Test 3"], isOpened: false),
Section(title: "Section 4", options: ["Test 1", "Test 2", "Test 3"], isOpened: false)
]
// get rid of extra table view cells
picsTableView.tableFooterView = UIView()
// customize button
addButton.layer.cornerRadius = 0.5 * addButton.bounds.size.width
addButton.clipsToBounds = true
addButton.backgroundColor = .red
addButton.tintColor = .white
addButton.setImage(#imageLiteral(resourceName: "plus-5-512"), for: .normal)
view.bringSubviewToFront(addButton)
fpc.addPanel(toParent: self) //added as last statement
和
func addPanel(toParent: UIViewController)
toParent.addChild(self)
toParent.view.addSubview(self.view)
self.didMove(toParent: toParent)
toParent.view.bringSubviewToFront(self.view)
【讨论】:
非常感谢!我还有另一个问题需要我发布的帮助。这是我的应用程序的一种暂停进展。您也可以看看它,看看您是否可以提供帮助?似乎没有人回应。这是关于为 tableview 创建子节标题的问题。 您好,我现在是 afk,待会回来看看 谢谢! ***.com/questions/66621679/… @christian-w:查看您的问题,人们没有回应的原因是因为通常在 SO 人们希望您发布到目前为止您尝试过的内容,以及如果您遇到问题或做错了什么人们会帮助你,但是没有添加代码或显示没有努力的问题使问题看起来像这里是我现在需要的给我代码:) 这绝对不是 SO 的工作方式:) 据说你期待 3 个级别数据显示模式不是吗?像 sprots -> 美国体育 -> 棒球,你能更新你的问题并添加你的数据是什么样子的吗 您打算如何在数据模型中驱动这种多次双击(层次结构)?因为您可能需要在点击时隐藏/显示行,您需要展开和折叠单元格和部分标题,除非您向我们展示到目前为止您如何格式化数据,否则无法编写代码?以及您现在实施了什么。如果您不知道从哪里开始阅读:medium.com/@jeantimex/…programmingwithswift.com/…以上是关于FloatingPanel 没有出现 - Swift Xcode的主要内容,如果未能解决你的问题,请参考以下文章