- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对 Swift 来说有点陌生,但到目前为止很享受挑战。我已经编写了一些代码,但想知道如何在 Swift 中传递 firebase 数组中的选择以将 Controller 移动到描述?我以 Chris 为基础编写了代码,但其中不涉及数组。
这是我的搜索数组和转场代码。该数组工作正常,但是当选择一个单元格时,会发生转场,但不会显示任何细节,即文本标签为空。
提前致谢。
以下是将 Firebase 信息解析为数组的代码
import UIKit
import Firebase
class LocateTableViewController: UITableViewController, UISearchResultsUpdating {
@IBOutlet var locateTableView: UITableView!
let searchController = UISearchController(searchResultsController: nil)
var firManager:FirebaseManager?
var placesArray = [NSDictionary?]()
var filtersPlaces = [NSDictionary?]()
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
self.searchController.searchBar.placeholder = "Search bars, brewpubs, shops..."
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
tableView.tableHeaderView = searchController.searchBar
let databaseRef = Database.database().reference()
// search based on name of place
databaseRef.child("places").queryOrdered(byChild: "name").observe(.childAdded, with: { (snapshot) in
self.placesArray.append(snapshot.value as? NSDictionary)
// insert rows
self.locateTableView.insertRows(at: [IndexPath(row:self.placesArray.count-1,section:0)], with: UITableViewRowAnimation.automatic)
}) { (error) in
print(error.localizedDescription)
}
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
if searchController.isActive && searchController.searchBar.text != ""{
return filtersPlaces.count
}
return self.placesArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
// Configure the cell...
let place : NSDictionary?
if searchController.isActive && searchController.searchBar.text != ""{
place = filtersPlaces[indexPath.row]
}
else {
place = self.placesArray[indexPath.row]
}
cell.textLabel?.text = place?["type"] as? String
cell.detailTextLabel?.text = place?["name"] as? String
return cell
}
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Check if there's a selection first
if let actualIndexPath = tableView.indexPathForSelectedRow {
if segue.identifier == "detailSegue" {
// Get the selected place
let selectedPlace = getPlaceForIndex(indexPath: actualIndexPath)
// Create the detail model and set the place
let detailModel = DetailModel()
detailModel.place = selectedPlace
// Set the detail model for the Detail View Controller
let detailVC = segue.destination as! DetailViewController
detailVC.model = detailModel
}
}
}
func updateSearchResults(for searchController: UISearchController) {
filterContent(searchText: self.searchController.searchBar.text!)
// Update search results
}
func filterContent(searchText: String)
{
self.filtersPlaces = self.placesArray.filter { place in
let placename = place!["name"] as? String
return(placename?.lowercased().contains(searchText.lowercased()))!
}
tableView.reloadData()
}
func getPlaceForIndex(indexPath:IndexPath) -> Place {
return places[indexPath.row]
}
}
这是信息应该进入的详细 View Controller 的代码:
import UIKit
class DetailViewController: UIViewController, DetailModelDelegate, WriteReviewChildViewControllerDelegate {
// MARK: - Properties
var place:Place?
var model:DetailModel?
var currentViewController:UIViewController?
@IBOutlet weak var placeImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var categoryLabel: UILabel!
@IBOutlet weak var faveButton: UIButton!
@IBOutlet weak var descriptionSectionButton: UIButton!
@IBOutlet weak var reviewsSectionButton: UIButton!
@IBOutlet weak var writeReviewSectionButton: UIButton!
@IBOutlet weak var containerView: UIView!
@IBOutlet weak var viewTopConstraint: NSLayoutConstraint!
@IBOutlet weak var viewBottomConstraint: NSLayoutConstraint!
// MARK: - View Controller Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
// Register to listen for keyboard notifications
NotificationCenter.default.addObserver(self, selector: #selector(keyboardIsShowing(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardIsHiding(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
// Check if there's a model
// If so, then fetch the meta data for that place
if let actualModel = model {
// Set delegate to self
actualModel.delegate = self
// Call the get meta function
actualModel.getMeta()
}
}
override func viewWillDisappear(_ animated: Bool) {
if let actualModel = model {
actualModel.closeObserver()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Display
func displayMetaData() {
// Check if there's a place object in the property
if place == nil {
return
}
// Set image
model?.getImage(imageName: place!.detailImageName)
// Set name label
nameLabel.text = place!.name
// Set the category label
categoryLabel.text = place!.type
// Set description
if type(of: currentViewController!) == DescriptionChildViewController.self {
(currentViewController as? DescriptionChildViewController)?.setDescriptionLabel(text: place!.desc)
}
else if type(of: currentViewController!) == ReviewsChildViewController.self {
// In case the Reviews Child View Controller is already displayed,
// We call this function to set the new data and refresh the table
let reviewsVC = currentViewController as! ReviewsChildViewController
reviewsVC.reloadReviewsData(newReviewData: place!.reviews)
}
// See if this place is faved
setFaveButtonIcon()
}
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Set the currentViewController property to the Description Child View Controller
// because that's the first one that is shown in the container view
currentViewController = segue.destination
}
@IBAction func sectionButtonTapped(_ sender: UIButton) {
// Declare a variable to hold the destination VC
var toVC:UIViewController?
// Set section button colors to white
descriptionSectionButton.setTitleColor(UIColor.white, for: .normal)
reviewsSectionButton.setTitleColor(UIColor.white, for: .normal)
writeReviewSectionButton.setTitleColor(UIColor.white, for: .normal)
// Set active button color
sender.setTitleColor(UIColor.blue, for: .normal)
// See which tag triggered this
switch sender.tag {
case 1:
// Description button tapped
// Create an instance of the Description Child View Controller
toVC = storyboard?.instantiateViewController(withIdentifier: "DescriptionChildVC")
if let descVC = toVC, let actualPlace = place {
(descVC as! DescriptionChildViewController).descText = actualPlace.desc
}
case 2:
// Reviews button tapped
// Create an instance of the Description Child View Controller
toVC = storyboard?.instantiateViewController(withIdentifier: "ReviewsChildVC")
if let reviewsVC = toVC, let actualPlace = place {
(reviewsVC as! ReviewsChildViewController).reviews = actualPlace.reviews
}
case 3:
// Write a review button tapped
// Create an instance of the Description Child View Controller
toVC = storyboard?.instantiateViewController(withIdentifier: "WriteReviewChildVC")
if let writeReviewsVC = toVC {
(writeReviewsVC as! WriteReviewChildViewController).delegate = self
}
default:
// Description button tapped
// Create an instance of the Description Child View Controller
toVC = storyboard?.instantiateViewController(withIdentifier: "DescriptionChildVC")
}
// Call SwitchChildViewControllers if currentViewController and toVC are not nil
if let destinationVC = toVC, let currentVC = currentViewController {
switchChildViewControllers(fromVC: currentVC, toVC: destinationVC)
}
}
func switchChildViewControllers(fromVC:UIViewController, toVC:UIViewController) {
// Tell the current VC that its transitioning
fromVC.willMove(toParentViewController: nil)
// Add the new VC
self.addChildViewController(toVC)
containerView.addSubview(toVC.view)
// Size the frame of the toVC
toVC.view.frame = containerView.bounds
// Set the new VC alpha to 0
toVC.view.alpha = 0
// Animate the new VC alpha to 1 and the old VC alpha to 0
UIView.animate(withDuration: 0.5, animations: {
toVC.view.alpha = 1
fromVC.view.alpha = 0
}) { (Bool) in
// Remove the old VC
fromVC.view.removeFromSuperview()
fromVC.removeFromParentViewController()
// Tell the new VC that it has transitioned
toVC.didMove(toParentViewController: self)
// Set the currentViewController property to toVC
self.currentViewController = toVC
}
}
// MARK: - Button Action Functions
@IBAction func backButtonTapped(_ sender: UIButton) {
// Navigate back to the list
presentingViewController?.dismiss(animated: true, completion: nil)
}
@IBAction func shareButtonTapped(_ sender: UIButton) {
if place == nil {
return
}
// Data items array
var activityItems = [Any]()
// Get the image
let imageData = CacheManager.getImageFromCache(imageName: place!.detailImageName)
if let actualImageData = imageData {
// Since we have the image data, create a UIImage
let image = UIImage(data: actualImageData)
if image != nil {
activityItems.append(image!)
}
}
// Add the description to the activity items
activityItems.append(place!.desc)
// Create a UIActivityViewController
let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
// Present it
present(activityVC, animated: true, completion: nil)
}
@IBAction func routeButtonTapped(_ sender: UIButton) {
if place == nil {
return
}
// Create a url
let modifiedAddress = place!.addr.replacingOccurrences(of: " ", with: "+")
let url = URL(string: "http://maps.apple.com/?address=" + modifiedAddress)
if let actualURL = url {
// Open url
UIApplication.shared.open(actualURL, options: [:], completionHandler: nil)
}
}
@IBAction func favButtonTapped(_ sender: UIButton) {
if place != nil {
CacheManager.toggleFave(placeId: place!.id)
setFaveButtonIcon()
}
}
// MARK: - Helper Functions
func setFaveButtonIcon() {
if CacheManager.isFave(placeId: place!.id) {
faveButton.setImage(#imageLiteral(resourceName: "Bookmark Ribbon Filled"), for: .normal)
}
else {
faveButton.setImage(#imageLiteral(resourceName: "Bookmark Ribbon"), for: .normal)
}
}
// MARK: - DetailModelDelegate methods
func detailModel(metaDataFor place: Place) {
// Set the place property
self.place = place
// Display the meta data in the views
displayMetaData()
}
func detailModel(imageName: String, imageData: Data) {
// Detail model has returned with image data
// Now can set image view
let image = UIImage(data: imageData)
if let actualImage = image {
placeImageView.image = actualImage
}
}
func detailModelSaveReviewError() {
// Show the error alert
let alertController = UIAlertController(title: "Error", message: "There was an error saving your review", preferredStyle: .alert)
let okAction = UIAlertAction(title: "Ok", style: .default, handler: nil)
alertController.addAction(okAction)
present(alertController, animated: false, completion: nil)
}
func detailModelSaveReviewSuccess() {
// Show the reviews child vc
sectionButtonTapped(reviewsSectionButton)
}
// MARK: - WriteReviewChildViewControllerDelegate Methods
func saveReview(name: String, text: String) {
// Child view controller is calling save review
// Pass that data to the detail model
if let actualModel = model {
// Call saveReview of the detailmodel
actualModel.saveReview(name, text)
}
}
@objc func keyboardIsShowing(notification:NSNotification) {
let userInfo = notification.userInfo
if let userInfoDictionary = userInfo {
let keyboardRect = userInfoDictionary["UIKeyboardFrameEndUserInfoKey"] as! CGRect
// Animate the constraints
view.layoutIfNeeded()
UIView.animate(withDuration: 0.25) {
self.viewTopConstraint.constant = keyboardRect.height * -1
self.viewBottomConstraint.constant = keyboardRect.height
self.view.layoutIfNeeded()
}
}
}
@objc func keyboardIsHiding(notification:NSNotification) {
// Animate the constraints
view.layoutIfNeeded()
UIView.animate(withDuration: 0.25) {
self.viewTopConstraint.constant = 0
self.viewBottomConstraint.constant = 0
self.view.layoutIfNeeded()
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Call the "hide keyboard" function of the write reviews child view controller
if type(of: currentViewController!) == WriteReviewChildViewController.self {
(currentViewController as! WriteReviewChildViewController).hideKeyboard()
}
}
}
最佳答案
过去是什么让我头疼。
有时我必须删除单元格并重新创建才能解决问题。
希望这有帮助。
关于ios - 将结果从 Swift 数组传递到 Segue 到描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47391744/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!