Ahora tienes que copiar el código dentro de la definición de clase del ProductsTableViewController.swift
clasifica tu clase de cuerpo CustomersTableViewController
.
Pon todo dentro del CustomersTableViewController
sonó desde:
class CustomersTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 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
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 0
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return 0
}
/*
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
// Configure the cell...
return cell
}
*/
/*
// Override to support conditional editing of the table view.
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
*/
/*
// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// Delete the row from the data source
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
*/
/*
// Override to support rearranging the table view.
override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
}
*/
/*
// Override to support conditional rearranging of the table view.
override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable.
return true
}
*/
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
}
A:
//
// CustomersTableViewController.swift
// MySampleAppCatalyst
//
// Created by Muessig, Kevin on 3/12/20.
// Copyright © 2020 SAP. All rights reserved.
//
import UIKit
import SAPFiori
import SAPFoundation
import SAPOData
import SAPFioriFlows
import SAPCommon
class CustomersTableViewController: UITableViewController, SAPFioriLoadingIndicator {
var loadingIndicator: FUILoadingIndicatorView?
let destinations = FileConfigurationProvider("AppParameters").provideConfiguration().configuration["Destinations"] as! NSDictionary
var dataService: ESPMContainer<OfflineODataProvider>? {
guard let odataController = OnboardingSessionManager.shared.onboardingSession?.odataControllers[destinations["com.sap.edm.sampleservice.v2"] as! String] as? Comsapedmsampleservicev2OfflineODataController, let dataService = odataController.espmContainer else {
AlertHelper.displayAlert(with: NSLocalizedString("OData service is not reachable, please onboard again.", comment: ""), error: nil, viewController: self)
return nil
}
return dataService
}
private let appDelegate = UIApplication.shared.delegate as! AppDelegate
private let logger = Logger.shared(named: "ProductsTableViewController")
private var customers = [Customer]()
private var searchController: FUISearchController?
private var searchedCustomers = [Customer]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(FUIObjectTableViewCell.self, forCellReuseIdentifier: FUIObjectTableViewCell.reuseIdentifier)
tableView.estimatedRowHeight = 120
tableView.rowHeight = UITableView.automaticDimension
loadData()
setupSearchBar()
}
private func loadData() {
showFioriLoadingIndicator()
fetchCustomers {
self.tableView.reloadData()
self.hideFioriLoadingIndicator()
}
}
private func fetchCustomers(completionHandler: @escaping () -> Void) {
dataService?.fetchCustomers() { [weak self] result, error in
if let error = error {
AlertHelper.displayAlert(with: NSLocalizedString("Failed to load list of products!", comment: ""), error: error, viewController: self!)
self?.logger.error("Failed to load list of products!", error: error)
return
}
self?.customers = result!
completionHandler()
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return isSearching() ? searchedCustomers.count : customers.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let customer = isSearching() ? searchedCustomers[indexPath.row] : customers[indexPath.row]
let customerCell = tableView.dequeueReusableCell(withIdentifier: FUIObjectTableViewCell.reuseIdentifier) as! FUIObjectTableViewCell
customerCell.accessoryType = .none
let customerName = "(customer.firstName ?? "") (customer.lastName ?? "")"
customerCell.headlineText = customerName
customerCell.detailImageView.image = FUIIconLibrary.system.me
customerCell.detailImageView.isCircular = true
if let customerDOB = customer.dateOfBirth {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
customerCell.subheadlineText = "(dateFormatter.string(from: customerDOB.utc()))"
}
return customerCell
}
// MARK: - Search Bar
private func setupSearchBar() {
// Search Controller setup
searchController = FUISearchController(searchResultsController: nil)
searchController!.searchResultsUpdater = self
searchController!.hidesNavigationBarDuringPresentation = true
searchController!.searchBar.placeholderText = NSLocalizedString("Search for customers...", comment: "")
searchController!.searchBar.isBarcodeScannerEnabled = false
self.tableView.tableHeaderView = searchController!.searchBar
}
// verify if the search text is empty or not
private func searchTextIsEmpty() -> Bool {
return searchController?.searchBar.text?.isEmpty ?? true
}
// actual search logic for finding the correct products for the term the user is searching for
private func searchProducts(_ searchText: String) {
searchedCustomers = customers.filter({( customer : Customer) -> Bool in
let customerName = "(customer.firstName ?? "") (customer.lastName ?? "")"
return customerName.lowercased().contains(searchText.lowercased())
})
tableView.reloadData()
}
// verify if the user is currently searching or not
private func isSearching() -> Bool {
return searchController?.isActive ?? false && !searchTextIsEmpty()
}
}
// MARK: - UISearchResultsUpdating extension
extension CustomersTableViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
if let searchText = searchController.searchBar.text {
searchProducts(searchText)
return
}
}
}
Si compila ahora, no debería haber errores de tiempo de compilación, si obtiene un error de tiempo de compilación para el odataController
recuerda el import SAPOfflineOData
declaración de importación. Usaste casi el mismo código que en el ProductsTableViewController.swift
class y modificarlo. Solo tenía que reemplazar el producto y el cliente con todas las definiciones de producto. tableView(_:cellForRowAt:)
un método para usar los detalles del producto similar a la pantalla de descripción general.
También el loadProductImages()
el método ya no es necesario, así que lo eliminó.