Hey team I'm facing an issue where startDate is 1 January 2025 and endDate is 31 March 2025 between this 2 dates is 90 days, but on my code is being taken as 89 days
I've seen the math of the code excludes the first partial day (from midnight to 06:00) on 2025-01-01, which results in 89 full days instead of 90 days.
startDate: 2025-01-01 06:00:00 +0000
endDate: 2025-03-31 06:00:00 +0000
this is my function
func daysBetweenDates() -> Int? {
guard let selectedStartDate = selectedStartDate?.date else { return nil }
guard let selectedEndDate = selectedEndDate?.date else { return 0 }
let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.day], from: selectedStartDate, to: selectedEndDate)
return dateComponents.day
}
what I've tried is reset the hours to 0 so it can take the full day and return 90 days
like this
func daysBetweenDates() -> Int? {
guard let selectedStartDate = selectedStartDate?.date else { return nil }
guard let selectedEndDate = selectedEndDate?.date else { return 0 }
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(secondsFromGMT: 0) ?? .current
let cleanMidNightStartDate = calendar.startOfDay(for: selectedStartDate)
let cleanMidNightEndDate = calendar.startOfDay(for: selectedEndDate.addingTimeInterval(24 * 60 * 60))
let dateComponents = calendar.dateComponents([.day], from: cleanMidNightStartDate, to: cleanMidNightEndDate)
let daysCount = dateComponents.day ?? 0
return daysCount
}
this worked for that date specifically but when I tried to change the date for example
startDate: 18 December 2024.
endDate: 18 March 2025.
between those dates we have 90 days but this function now reads 91.
what I'm looking is a cleaver solution for this problem so I can have the best posible quality code, thanks in advance!
Post
Replies
Boosts
Views
Activity
Hello Team we facing a problem with a UIView inside of a Navigation Bar what we need to achieve is to place a UIView (SwiftUI Wrapper) on the middle of the Navigation bar
Here's how it looks like right now
that's already complete, but now the problem that we are facing is that the View is not detecting the clicks/taps on the 'dates and 'travelers'
here's the Code for the View
private lazy var sharedUIPlaybackView: UIView = {
let containerView = UIView().withAutoLayout()
containerView.backgroundColor = .red
containerView.styleBorder(color: .systemPink, width: 1)
let propertySearchCriteria = PropertySearchCriteriaBuilder(hotelSearchParameters: viewModel.hotelSearchParameters).criteria
var swiftUIView: SwiftUIView<LodgingPlaybackWrapper>! = nil
swiftUIView = SwiftUIView(
LodgingPlaybackWrapper(propertySearchCriteria: propertySearchCriteria,
playbackUpdateNotificationSender: nil,
componentHandler: { [weak self] componentId in
self?.componentReady(componentId)
}),
viewDidLayoutSubviewsCallback: { [weak self] in
let newHeight = swiftUIView.frame.size.height
if newHeight != self?.sharedUIPlaybackViewHeightConstraint?.constant {
self?.sharedUIPlaybackViewHeightConstraint?.constant = newHeight
self?.additionalSafeAreaInsets.top = 200
}
}
).withAutoLayout().withAccessibilityIdentifier("searchPlayback")
sharedUIPlaybackViewHeightConstraint = containerView.heightAnchor.constraint(equalToConstant: 0)
sharedUIPlaybackViewHeightConstraint?.isActive = true
swiftUIView.backgroundColor = .blue
swiftUIView.styleBorder(color: .orange, width: 1)
containerView.addSubview(swiftUIView)
containerView.addConstraints([
swiftUIView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: Spacing.spacing4x),
swiftUIView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -Spacing.spacing4x)
])
self.view.bringSubviewToFront(swiftUIView)
swiftUIView.isUserInteractionEnabled = true
swiftUIView.layer.zPosition = 1
return containerView
}()
my first suspicion was that the this part of the code was not expanding correctly
viewDidLayoutSubviewsCallback: { [weak self] in
let newHeight = swiftUIView.frame.size.height
if newHeight != self?.sharedUIPlaybackViewHeightConstraint?.constant {
self?.sharedUIPlaybackViewHeightConstraint?.constant = newHeight
self?.additionalSafeAreaInsets.top = 200
}
}
but after I place border and background colors on the views was clear for me that it was expanding properly, so I added some modifiers for the view like
swiftUIView.isUserInteractionEnabled = true
swiftUIView.layer.zPosition = 1
but didn't work, I'm asking for a solution and different point of view for the code to be more cleaner and do the best implementation posible.
This Navigation bar should be treated as a custom Navigation Bar, or it is good for us to expand and treat the Navigation bar like this? (expanding and adding a Custom View)
thanks in advance to anyone who read this.
here's the View Hierarchy
I notice that this operation is expensive for the code (2^set.size). I'm looking the best practices and implementations more likely a re-work this code goes to a infinite bucle and freezes the app until it's done
func generateSubsets(set: Set<String>) -> Set<Set<String>> {
if set.count == 1 { return [set] }
let first = set.map { item -> Set<String> in
var clone = set
clone.remove(item)
return clone
}
let second = first.map(generateSubsets)
var subSets = second.reduce(Set<Set<String>>()) { accumulator, elements in
var clone = accumulator
for element in elements {
clone.insert(element)
}
return clone
}
subSets.insert(set)
return subSets
}
Example
For input ["qual1", "qual2", 'qual3"]
the combinations can be: ["qual1#qual2#qual3", "qual1#qual2", "qual1#qual3", "qual2#qual3", "qual1", "qual2", "qual3"]
Hey guys I'm having some struggles when trying to understand how to edit certain section for a viewForFooterInSection
note the edit occurs when the user types something and this function gets call, that is already managed
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return prepareFooterView(tableView: tableView, section: section)
}
the question is how can I access certain section for me to edit the title on it?
the function for footherview is:
func prepareFooterView(tableView: UITableView, section: Int) -> UIView?{
guard let tableView = tableView as? LightTableView else { return UIView() }
guard section <= TableSection.all.count else { return UIView() }
///the section is obtained here
let section = TableSection.all[section]
var title = ""
switch section {
case .detailsFooterView:
title = "card_details_section_footer".localized
case .nickname:
if nickname?.isValidNickName == false {
return prepareSpecificMessageInFooterView(with: "card_nickname_section_footer_error".localized, errorMessage: true)
}
title = "card_nickname_section_footer".localized
case .fastlink:
title = "earn_rewards_section_footer".localized
default:
title = ""
}
var footerView = tableView.standardFooterView(withTitle: title, textAlignment: .left, accessibilityIdentifier: section == .nickname || section == .fastlink || section == .detailsFooterView ? "NicknameFooterViewID" : nil, labelPadding: UIEdgeInsets(top: 12, left: 16, bottom: 0, right: -16))
return section == .nickname || section == .fastlink || section == .detailsFooterView ? footerView : nil
}
I would like to edit the case .fastlink: when a flag is turned ON
the section here:
num TableSection: Int {
case details
case detailsFooterView
case nickname
case fastlink
case scan
static var all: [TableSection] = isUs ? [.details, .detailsFooterView, .nickname, .fastlink] : [.details, .detailsFooterView, .nickname, .fastlink, .scan]
}
I guess this is not clear for me because this is running live instead of reloading the entire screen for example indexPath.row == 1
Hey Developers I'm facing some strange situation, I'm getting multiples issues related to optimization on Release build configuration, I'm using Xcode 13.2.1
project is separated in 4 markets and multiples frameworks none of the markets have dependencies from each other, issue only appears when the market RefrreshAtPumpAUS Release is build, on the other side for Debug everything is functional and the app build fine.
here's my Podfile:
Podfile
in order to add the : def adobe_manager_pods
into the framework: CoolMasterUtilsFramework
as the project is in 4 different markets had to added in the different markets like this:
target 'RefrreshAtPumpNL' do
# Pods for RefrreshAtPump
common_pods
adobe_manager_pods --> here
target 'RefrreshAtPumpUS' do
# Pods for RefrreshAtPump
common_pods
firebase_pods
adobe_campaign_pods
adobe_manager_pods. --> here
target 'RefrreshAtPumpUK' do
# Pods for RefrreshAtPump
common_pods
adobe_manager_pods --> here
but for the AUS market(RefrreshAtPumpAUS) is quite different
already had added similar PODS
target 'RefrreshAtPumpAUS' do
# Pods for RefrreshAtPump
common_pods
firebase_pods
adobe_experience_pods. ->> here
they have this so, I added the 2 remaining that I needed for that specific market.
def adobe_experience_pods
pod 'AEPAudience', '~> 3.0’ ------->> THIS ONE
pod 'ACPUserProfile', '~> 2.2’ ------->> THIS ONE
pod 'AEPEdgeIdentity', '~> 1.0'
pod 'AEPEdgeConsent', '~> 1.0'
pod 'AEPCore', '~> 3.0'
pod 'AEPIdentity', '~> 3.0'
pod 'AEPSignal', '~>3.0'
pod 'AEPLifecycle', '~>3.0'
pod 'AEPUserProfile', '~> 3.0'
pod 'AEPEdge', '~> 1.0'
pod 'AEPMessaging', '~> 1.0'
pod 'AEPAssurance', '~> 3.0', :configurations => ['Debug']
end
so if I run the project in all other markets as RELEASE or DEBUG everything goes well, but only for RELEASE on RefrreshAtPumpAUS
shows errors like this:
multiple errors
I've tried
adding lines inside the RefrreshAtPumpAUS
like this:
1.- post_install do |installer|
2.- Pod update
3.- delete all Derived data
4.- in Build settings -> Apple Clang - Code generation -> Optimization level to None[-O0]
5.- in Build settings -> Build active architecture only -> ALL to YES
6.- in podfile -> delete this line use_frameworks! and adding use_modular_headers!
7.- in Build settings -> Swift compiler -> Code generation -> Incremental to all
Error 1
I am trying to get a UITableView with a UICollectionView to show the following data set correctly inside the UICollectionViews.
the array which contains all this information is arregloDeArreglos
here's the data - some : 1
[![dads][1]][1]
However, when I scroll horizontally inside the UICollectionViews, the data will get all messed up.
[1]: https:// i.stack. imgur. com/z9bw7 . png
[2]: https://i. stack. imgur.com/lCS13 . png
as you can see in both pictures
here's my code
table delegate and data source }
uicollection delegate and datasource
}
uiCollectionviewCell }
Hi, im struggle with my cell model it's only showing my array position 0
what i'm trying to reach is show in each UICollectionView the information inside
arregloBidimencional
which contains let episodes: [episodess]? and let tack: Int?
episodess is my main struct for the didSet inside each UICollectionviewCell
and tack is my identifier for each array of [episodess]
}
var arraySeasonsEpisodes: [episodess] = [] its type of episodess
so my model to get the previous data is }
so the didset in UICollectionViewCell it's set like this }
this is how i storage the data from the json dictionary }
Hi, i'm having this issue using Xcode 12.2 were i can't scroll in horizontal direction a UICollectionView, i have try multiples answers from the forum and none of then work for me
first of all what i'm only trying to achieve is the scroll horizontally.
Heres my UITableView declaration on the View: }()
here's the Delegate and DataSource protocols in VC: }
This is the code for UICollectionView declaration on the NumberOfSeasonsCell or UITableViewCell }()
Protocols for the UICollectionView }
i've read that i should store the last position of the Table for scrolling the UICollectionView but i've tried but not work for me
here's the UICollectionViewCell }
Hi developers im having this trouble with expandable cells sections when using return arrayUiText[section].nombre.count on numberOfRowsInSection, only returns 1 cell and that's correct because it only have 1 number in the array, but my question is how could i return more than one because i have 3 different cells but returning is been a struggle for me as you can see my arrayUiText as multiples names in diffent arrays, i could archieve my goal just adding multiples names on 1 array, but i could only use 1 SectionHeader and that's not what i wanted to do nombre: ["dasdad dasda", "asdasdasda", "asdasdsa"] like this.
i try to numberOfRowsInSection return 3 but it collapses
typeOfPasajeroNameLastName(isExpanded: false, pasajeroNumber: ["Pasajero 1"], pasajeroType: ["Adulto"], nombre: ["dasdad dasda"], apellido: ["asdasd asdas"], birthDate: ["24/05/1994"]),
typeOfPasajeroNameLastName(isExpanded: false, pasajeroNumber: ["Pasajero 2"], pasajeroType: ["Adulto"], nombre: ["asdad"], apellido: ["asda asdasd"], birthDate: ["21/04/1994"]),
typeOfPasajeroNameLastName(isExpanded: false, pasajeroNumber: ["Pasajero 3"], pasajeroType: ["Bebé"], nombre: ["asdas"], apellido: ["asdasd asdass"], birthDate: ["08/08/2018"])
]
extension PasajerosPaso2View: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if !arrayUiText[section].isExpanded{
return 0
}
return arrayUiText[section].nombre.count //this returns 1 i want returning 3
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "pasajerosData", for: indexPath) as! PasajerosPaso2Cell
cell.selectionStyle = .none
cell.tipoDeDatoTextField.text = arrayUiText[indexPath.section].nombre[indexPath.row]
cell.tipoDeDatoTextField.delegate = self
print("indexpath 0: \(arrayUiText[indexPath.section].nombre)")
return cell
}
if indexPath.row == 1{
let cell = tableView.dequeueReusableCell(withIdentifier: "pasajerosApellidos", for: indexPath) as! PasajerosApellidosCell
cell.selectionStyle = .none
cell.tipoDeDatoTextField.text = arrayUiText[indexPath.section].apellido[indexPath.row]
cell.tipoDeDatoTextField.delegate = self
print("indexpath 1: \(arrayUiText[indexPath.section].apellido)")
return cell
}
else {
let cell2 = tableView.dequeueReusableCell(withIdentifier: "pasajerosBirthday", for: indexPath) as! PasajerosDateCell
cell2.selectionStyle = .none
cell2.tipoDeDatoTextField.text = arrayUiText[indexPath.section].birthDate[indexPath.row]
print("indexpath 2: \(arrayUiText[indexPath.section].birthDate[indexPath.row])")
return cell2
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.row)
}
func numberOfSections(in tableView: UITableView) -> Int {
return 3
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: tableView.frame.width, height: 50))
let headerCell = tableView.dequeueReusableCell(withIdentifier: "titleCelll") as! TitleCell
headerView.addSubview(headerCell)
headerView.backgroundColor = .white
headerCell.pasajeroNumber.text = arrayUiText[section].pasajeroNumber.first
headerCell.pasajeroType.text = arrayUiText[section].pasajeroType.first
let tapGesture5: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleExpandClose2))
tapGesture5.numberOfTapsRequired = 1
tapGesture5.numberOfTouchesRequired = 1
headerCell.isUserInteractionEnabled = true
headerCell.addGestureRecognizer(tapGesture5)
headerCell.tag = section
print(headerCell.tag)
return headerView
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
}
@objc func handleExpandClose2(sender: UITapGestureRecognizer) {
print("Trying to expand and close section...")
//delegate?.cerrarLista1(self)
let section = sender.view?.tag ?? 0
// we'll try to close the section first by deleting the rows
var indexPaths = [IndexPath]()
for row in arrayUiText[section].nombre.indices {
let indexPath = IndexPath(row: row, section: section)
indexPaths.append(indexPath)
}
let isExpanded = arrayUiText[section].isExpanded
arrayUiText[section].isExpanded = !isExpanded
if isExpanded {
pasajerosTableView.deleteRows(at: indexPaths, with: .fade)
} else {
pasajerosTableView.insertRows(at: indexPaths, with: .fade)
}
}
Hi developers im trying to do a request like my postman using basic auth with an Username & password, but i can't archieve, heres what i have done so farthis is how postman look likeAuthorization-> Type ->Basic Auth username: example_Username password: example_PasswordBody-> form-dataKEY: grant_type VALUE: passwordKEY: username VALUE: test@gmail.comKEY: password VALUE: 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4first i tryied this wayfunc postDataFormRequest(resource: TokenRequest, completion: @escaping (Result<Token, NetworkError>) -> Void) {
let headers = [
"Username": "example_api",
"Password": "example_api_password",
"Content-Type": "application/form-data"
]
//this information comes from TokenRequestStruct once i call it form my VC
let body = "grant_type=\(resource.grant_type)&username=\(resource.username)&password=\(resource.password)"
guard let url = URL(string: "example/") else { return }
var request = URLRequest(url: url)
request.httpMethod = HTTPMethods.POST
request.timeoutInterval = 60
request.httpBody = body.data(using: .utf8)
request.allHTTPHeaderFields = headers
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data, error == nil else {
completion(.failure(.domainError))
return
}
let result = try? JSONDecoder().decode(Token.self, from: data)
if let result = result {
DispatchQueue.main.async {
completion(.success(result))
}
} else {
DispatchQueue.main.async {
completion(.failure(.decodingError))
}
}
}.resume()
}using this method response =CredStore - performQuery - Error copying matching creds. Error=-25300, query={ atyp = http; class = inet; "m_Limit" = "m_LimitAll"; ptcl = http; "r_Attributes" = 1; sdmn = "oauth2/client"; srvr = "3.216.253.237"; sync = syna;}tried to fix it by using arbitrary loads = YESdidn't workSecond waystatic func getPostString(params:[String:Any]) -> String
{
var data = [String]()
for(key, value) in params
{
data.append(key + "=\(value)")
}
return data.map { String($0) }.joined(separator: "&")
}
static func formData(url:URL, params:[String:Any], finish: @escaping ((message:String, data:Data?)) -> Void)
{
var request = URLRequest(url: url)
request.httpMethod = "POST"
let postString = self.getPostString(params: params)
request.httpBody = postString.data(using: .utf8)
var result:(message:String, data:Data?) = (message: "Fail", data: nil)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if(error != nil)
{
result.message = "Fail Error not null : \(error.debugDescription)"
}
else
{
result.message = "Success"
result.data = data
}
finish(result)
}
task.resume()
}usage:in my VClet dict:[String:String] = ["username": view.emailField.text ?? "", "password": view.passField.text ?? "", "grant_type": "password"]
let url = URL(string: “example”)!
NetworkManager.formData(url: url, params: dict) { (message, data) in
print(message)
print(data)
didn't work either it says Mising grant_typethird way:public static func LoginGenerateTokenPOST(userName: String, password: String, completion: @escaping (Bool) -> ()) {
let baseUrl = "example"
let url = URL(string: "\(baseUrl)example")!
var request = URLRequest(url: url)
request.setValue("application/form-data", forHTTPHeaderField: "Content-Type")
//request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("example_api", forHTTPHeaderField: "example_api_password")
request.httpMethod = "POST"
let postString = "username=\(userName.lowercased())&password=\(password.sha256())&grant_type=password"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
completion(false)
print("error")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
completion(false)
}
do {
if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
print(convertedJsonIntoDict)
}
}
catch let error as NSError {
completion(false)
print(error.localizedDescription)
}
}
task.resume()
}this is my third function didn't work eitherso my question is:what is the best way to use basic auth URLSession POST, what did i do wrong in any of the 3 cases?, or all 3 are useless
im trying to make an expandable table view inside of viewCellimport UIKit
class TableSupportVC: UITableViewController {
let interface: TableSupportView = {
let interface = TableSupportView(frame: CGRect.zero)
interface.translatesAutoresizingMaskIntoConstraints = false
return interface
}()
struct cellData {
var opened = Bool()
var title = String()
var sectionData = [String]()
}
struct dataInside {
var opened = Bool()
var title = String()
var info = [String]()
}
var tableViewData = [cellData]()
var tableViewDataInside = [dataInside]()
override func viewDidLoad() {
super.viewDidLoad()
//register tables
tableView.register(TableSupportCell.self, forCellReuseIdentifier: menuCellIdita)
tableView.register(TableSupportSubtitleCell.self, forCellReuseIdentifier: menuCellda)
// Heres my data for cells
tableViewData = [cellData(opened: false, title: "1", sectionData: ["1.1", "1.2","1.3","1.4"]),
cellData(opened: false, title: "2", sectionData: ["2.1", "2.2", "2.3"])
]
tableViewDataInside = [dataInside(opened: false, title: "1.1.1", info: ["1.1.1"])]
setThemeNavigationBar()
// Size Scrollview
interface.scrollView.contentSize = CGSize(width: wScreen, height: hScreen * 1.40)
initComponents()
}
func setThemeNavigationBar() {
let navigationBarAppearace = UINavigationBar.appearance()
navigationBarAppearace.tintColor = blueBlumon
navigationBarAppearace.barTintColor = blueBlumon
navigationController?.navigationBar.barTintColor = blueBlumon
navigationController?.navigationBar.barStyle = .blackOpaque
navigationController?.navigationBar.isTranslucent = false
}
private func initComponents() {
setNavItems()
setSubviews()
setAutolayout()
}
private func setSubviews() {
view.backgroundColor = UIColor.white
view.addSubview(interface)
}
private func setNavItems() {
let backIcon = UIImage(named: "whiteArrow")
let backItem = UIBarButtonItem(image: backIcon?.withRenderingMode(.alwaysTemplate), style: UIBarButtonItem.Style.plain, target: self, action: #selector(backPressed))
backItem.tintColor = UIColor.white
navigationItem.leftBarButtonItem = backItem
let logoIcon = UIImage(named: "itemLogoBlue")
let logoItem = UIBarButtonItem(image: logoIcon?.withRenderingMode(.alwaysOriginal), style: UIBarButtonItem.Style.plain, target: nil, action: nil)
navigationItem.rightBarButtonItem = logoItem
}
// Método para definir el autolayout de los componentes de la vista principal del controlador
private func setAutolayout() {
NSLayoutConstraint.activate([
interface.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
interface.trailingAnchor.constraint(equalTo: view.trailingAnchor),
interface.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
interface.leadingAnchor.constraint(equalTo: view.leadingAnchor)
])
}
// Método de selector backPressed
@objc private func backPressed() {
self.navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return tableViewData.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableViewData[section].opened == true{
return tableViewData[section].sectionData.count + 1
}
**//INDEX OUT OF RANGE HERE**
if tableViewDataInside[section].opened == true{
return tableViewDataInside[section].info.count + 1
}
else {
return 1
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0{
let cell = tableView.dequeueReusableCell(withIdentifier: menuCellIdita, for: indexPath) as! TableSupportCell
cell.optionTitle.text = tableViewData[indexPath.section].title
return cell
}
if indexPath.row == 2 && tableViewData[indexPath.section].title == "1.2"{
let cell = tableView.dequeueReusableCell(withIdentifier: menuCellda, for: indexPath) as! TableSupportSubtitleCell
cell.title.text = tableViewDataInside[indexPath.section].title
//cell.subtitle.text = tableViewDataInside[indexPath.section].info
return cell
}
else {
let cell = tableView.dequeueReusableCell(withIdentifier: menuCellIdita, for: indexPath) as! TableSupportCell
cell.optionTitle.text = tableViewData[indexPath.section].sectionData[indexPath.row - 1]
return cell
}
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("el indexpath es: \(indexPath.row)")
if indexPath.row == 0 {
if tableViewData[indexPath.section].opened == true{
tableViewData[indexPath.section].opened = false
let sections = IndexSet.init(integer: indexPath.section)
tableView.reloadSections(sections, with: .none)
}
else{
tableViewData[indexPath.section].opened = true
let sections = IndexSet.init(integer: indexPath.section)
tableView.reloadSections(sections, with: .none)
}
}
if indexPath.row == 2 && tableViewData[indexPath.section].title == "1.2"{
if tableViewDataInside[indexPath.section].opened == true{
tableViewDataInside[indexPath.section].opened = false
let sections = IndexSet.init(integer: indexPath.section)
tableView.reloadSections(sections, with: .none)
}
else{
tableViewDataInside[indexPath.section].opened = true
let sections = IndexSet.init(integer: indexPath.section)
tableView.reloadSections(sections, with: .none)
}
}
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 80
}
}as you can see every time the user selects certain cells it activateoverride func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.row == 0 {if user press row 0 it will activate the codesame case foroverride func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {but when i try to setoverride func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {and run it crash index out of rangethe main problem: i cant show my other cell *tableViewDataInside*when the user clicks for example 1.2
Hi developers im having some issue or misplaced tasksso i had to develop a framework with some functionsthis is my main FUNCTION where the issue began func saveDataDevice(idPos: String, macAddress: String) {
// this first function obtains the MAIN token for further tasks == 'tokenForTransaction'
let value = FirstInitDevice.tokentransaccional(username: idPos)
//now i'd 2 seconds timer after tokentransaccional is launched
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: {
//after obtain tokenForTransaction i can do any WS, deviceInitWsCall gets call now it returns 'PosId'
//after finish the task so i'd save it for further fuctions
let value2 = FirstInitDevice.deviceInitWsCall(serialNumber: idPos)
let posidd = value2.PosId
let convert = String(posidd)
UserDefaults.standard.set(convert, forKey: "PosId")
//now i can do the third function using PosId parameter and obtain 'rsa'
//this is where the trouble shows for the first time, because the application hasn't finish the past task
//FirstInitDevice.deviceInitWsCall is not done yet that's why my if == "" just in case ill show the error immediately
let value3 = FirstInitDevice.getKeyWS(posId: value2.PosId)
LoginSingleton.shared.pos_id = value2.PosId
if value3.rsa == "" {
let alert = UIAlertController(title: "alert", message: "Cannot init KEYS", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "OK", style: UIAlertAction.Style.destructive, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else {
// if not continue
//decrypt rsa data
let rsaData = RSA().getRSAData(publicKeyHex: value3.rsa)
keysSingleton.shared.tk = rsaData.tk
//func 4 runs after decrypt is done BUT is not, because third function is not over yet
let value4 = FirstInitDevice.callInitDukptKeys(pos_id: value2.PosId, rsa: rsaData.rsa, check_value: rsaData.checkValue, crc32: rsaData.crc32)
//same IF just in case == ""
if value4.ksnString == ""{
let alert = UIAlertController(title: "Alert", message: "Cannot init KEYS", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "OK", style: UIAlertAction.Style.destructive, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
} else{
keysSingleton.shared.ksn = value4.ksnString
keysSingleton.shared.new_key = value4.newKey
keysSingleton.shared.tk = value4.ksnString
self.doTransaction()
}
}
})
}as you can see one functions leads to another and so and so, it doesn't work without getting the previous parameterfor some reason the applications saves the LAST obtained parameter INSTED the current one, this apply to any other function in the libraryi have tried1.- increasing the timer forDispatchQueue.main.asyncAfter(deadline: .now() + 8.0, execute: {2.- set for every function deadline 8s3.- set DispatchGroup() .enter .leave to every functionbut it didn't work, so the question leads to How can i handle URLSession.shared.dataTask after they finish properlythis are the functions on my libraryFIRST FUNCTION tokentransaccionalpublic static func tokentransaccional(username: String){
let baseUrl = "http://bla bla"
let headers = [
"Authorization": "Basic bla bla"
]
let url = URL(string: "bla bla")!
var request = URLRequest(url: url)
request.allHTTPHeaderFields = headers
request.httpMethod = "POST"
request.timeoutInterval = 60
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
let password = username+"bla bla"
let postString = "bla bla"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
// check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
// check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
do {
if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
let responseError = convertedJsonIntoDict["error"] as? String
let errorDescription = convertedJsonIntoDict["error_description"] as? String
if responseError?.count == nil {
let tokenAcceso = convertedJsonIntoDict["access_token"] as? String
LoginSingleton.shared.tokenForTransaction = tokenAcceso ?? ""
UserDefaults.standard.set(tokenAcceso, forKey: "AccessTokenLogin")
} else {
print("error")
}
}
}
catch let error as NSError {
print("catch let error")
print(error.localizedDescription)
}
}
task.resume()
}second function deviceInitWsCallpublic static func deviceInitWsCall(serialNumber: String) -> (PosId: Int, transaction_profile: String) {
let token = UserDefaults.standard.string(forKey: "AccessTokenLogin") ?? ""
let headers = [
"Authorization": "bla bla"
]
let baseUrl = "bla bla"
let portBPC = "bla bla"
let deviceInitWsPoint = "bla bla"
let Url = String(format: "bla bla")
let serviceUrl = URL(string: Url)
let parameterDictionary = ["bla bla": serialNumber]
var request = URLRequest(url: serviceUrl!)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
let httpBody = try? JSONSerialization.data(withJSONObject: parameterDictionary, options: [])
request.httpBody = httpBody
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
do {
if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
print(convertedJsonIntoDict)
let response = convertedJsonIntoDict
let status = response["status"] as? Bool
if status == true {
UserDefaults.standard.set(response, forKey: "deviceInitDictionary")
let mainResponse = response["dataResponse"] as! NSDictionary
let getPosId = mainResponse["posId"] as! Int
UserDefaults.standard.set(getPosId, forKey: "getPosId")
let getQps = mainResponse["qps"] as! Bool
let getTransactionProfile = mainResponse["transactionProfile"] as! String
UserDefaults.standard.set(getTransactionProfile, forKey: "getTransactionProfile")
let dataContact = mainResponse["contact"] as! NSDictionary
let indicatorPartialCancellation = mainResponse["partialCancellation"] as? Bool
LoginSingleton.shared.qps = getQps
UserDefaults.standard.set(getQps, forKey: "getQps")
LoginSingleton.getInstance().pos_id = getPosId
dataPresentReatailPresent.shared.posId = getPosId
LoginSingleton.getInstance().qps = getQps
LoginSingleton.getInstance().transaction_profile = getTransactionProfile
LoginSingleton.getInstance().partialCancellation = indicatorPartialCancellation ?? false
}
else{
print("error")
}
}
} catch let error as NSError {
print("catch let error")
print(error.localizedDescription)
}
}.resume()
let PosId = UserDefaults.standard.integer(forKey: "getPosId")
let transaction_profile = UserDefaults.standard.string(forKey: "getTransactionProfile") ?? ""
return (PosId, transaction_profile)
}third function getKeyWSpublic static func getKeyWS(posId: Int) -> (rsa: String, rsa_id: Int) {
let token = UserDefaults.standard.string(forKey: "AccessTokenLogin") ?? ""
let headers = [
"Authorization": "bla bla"
]
let baseUrl = "bla bla"
let portBPC = ":bla bla"
let deviceGetKeyUrl = "bla bla"
let Url = String(format: "bla bla")
let serviceUrl = URL(string: Url)
let parameterDictionary = ["bla bla": posId]
var request = URLRequest(url: serviceUrl!)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
let httpBody = try? JSONSerialization.data(withJSONObject: parameterDictionary, options: [])
request.httpBody = httpBody
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("error=\(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
do {
if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
// Print out dictionary
print(convertedJsonIntoDict)
let response = convertedJsonIntoDict
guard let MainDataResponse = response["dataResponse"] as? NSDictionary else { return }
let rsa_id = MainDataResponse["rsaId"] as? Int ?? 0
let rsa = MainDataResponse["rsa"] as? String ?? ""
UserDefaults.standard.set(rsa_id, forKey: "rsa_id")
UserDefaults.standard.set(rsa, forKey: "rsa")
}
} catch let error as NSError {
print("catch let error")
print(error.localizedDescription)
}
}.resume()
let rsa = UserDefaults.standard.string(forKey: "rsa") ?? ""
let rsa_id = UserDefaults.standard.integer(forKey: "rsa_id")
return (rsa, rsa_id)
}fourth function callInitDukptKeyspublic static func callInitDukptKeys(pos_id: Int, rsa: String, check_value: String , crc32: String) -> (newKey: String, ksnString: String, crc32: String, checkValue: String) {
let token = UserDefaults.standard.string(forKey: "AccessTokenLogin") ?? ""
let headers = [
"Authorization": "bla bla"
]
let baseUrl = "bla bla"
let portBPC = ":bla bla"
let deviceInitDukptKeysUrll = "bla bla"
let UUrl = String(format: "bla bla")
let serviceUrlll = URL(string: UUrl)
let parameterDictionary = ["bla bla": String(pos_id),
"bla bla": rsa,
"bla bla": check_value,
"bla bla": crc32]
var requests = URLRequest(url: serviceUrlll!)
requests.httpMethod = "POST"
requests.allHTTPHeaderFields = headers
requests.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
requests.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
let httpBody = try? JSONSerialization.data(withJSONObject: parameterDictionary, options: [])
requests.httpBody = httpBody
_ = URLSession.shared.dataTask(with: requests) { data, response, error in
guard let data = data, error == nil else {
print("error=\(String(describing: error))")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}
do {
if let DictConvert = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
// Print out dictionary
let response = DictConvert
let status = response["status"] as? Bool
if status == true {
let mainResponse = response["dataResponse"] as? NSDictionary
let getKey = mainResponse!["key"] as? String
let keyCheckValue = mainResponse!["keyCheckValue"] as? String
let keyCrc32 = mainResponse!["keyCrc32"] as? String
let ksn = mainResponse!["ksn"] as? String
print("valor getKey: \(getKey)")
print("valor ksn: \(ksn)")
print("valor keyCrc32: \(keyCrc32)")
print("valor keyCheckValue: \(keyCheckValue)")
UserDefaults.standard.set(getKey, forKey: "getKey")
UserDefaults.standard.set(ksn, forKey: "ksn")
UserDefaults.standard.set(keyCrc32, forKey: "keyCrc32")
UserDefaults.standard.set(keyCheckValue, forKey: "keyCheckValue")
} else {
print("error")
}
}
} catch let error as NSError {
print("catch let error")
print(error.localizedDescription)
}
}.resume()
let newKey = UserDefaults.standard.string(forKey: "getKey") ?? ""
let ksnString = UserDefaults.standard.string(forKey: "ksn") ?? ""
let crc32 = UserDefaults.standard.string(forKey: "keyCrc32") ?? ""
let checkValue = UserDefaults.standard.string(forKey: "keyCheckValue") ?? ""
return (newKey, ksnString, crc32, checkValue)
}
Hi developers is there any chanse to disable Zoom-Out & Zoom-In in WkWebView?here's all my code so far keep in mind i'm only displaying a web in webView i don't have any other functions 😕import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
displayWebPage()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
let webView = WKWebView(frame: .zero, configuration: configuration)
// Do any additional setup after loading the view, typically from a nib.
}
private func displayWebPage() {
let url = URL(string: "hee hee")
let request = URLRequest(url: url!)
webView.navigationDelegate = self
webView.load(request)
webView.sizeToFit()
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print(error)
}
}