Posts

Post marked as solved
4 Replies
176 Views
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"]
Posted Last updated
.
Post not yet marked as solved
1 Replies
261 Views
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
Posted Last updated
.
Post not yet marked as solved
17 Replies
11k Views
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
Posted Last updated
.
Post not yet marked as solved
9 Replies
18k Views
Hi developers is there any chanse to disable Zoom-Out &amp; 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) } }
Posted Last updated
.
Post marked as solved
4 Replies
4.1k Views
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 }
Posted Last updated
.
Post not yet marked as solved
2 Replies
5.4k Views
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) -&gt; (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) -&gt; (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) -&gt; (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) }
Posted Last updated
.
Post marked as solved
13 Replies
1.2k Views
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 }
Posted Last updated
.
Post marked as solved
16 Replies
1.6k Views
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 }
Posted Last updated
.
Post not yet marked as solved
0 Replies
337 Views
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)     }   }
Posted Last updated
.
Post not yet marked as solved
3 Replies
5.4k Views
Hi developers im trying to do a request like my postman using basic auth with an Username &amp; password, but i can't archieve, heres what i have done so farthis is how postman look likeAuthorization-&gt; Type -&gt;Basic Auth username: example_Username password: example_PasswordBody-&gt; form-dataKEY: grant_type VALUE: passwordKEY: username VALUE: test@gmail.comKEY: password VALUE: 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4first i tryied this wayfunc postDataFormRequest(resource: TokenRequest, completion: @escaping (Result&lt;Token, NetworkError&gt;) -&gt; 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)&amp;username=\(resource.username)&amp;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]) -&gt; String { var data = [String]() for(key, value) in params { data.append(key + "=\(value)") } return data.map { String($0) }.joined(separator: "&amp;") } static func formData(url:URL, params:[String:Any], finish: @escaping ((message:String, data:Data?)) -&gt; 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) -&gt; ()) { 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())&amp;password=\(password.sha256())&amp;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
Posted Last updated
.
Post not yet marked as solved
4 Replies
640 Views
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) -&gt; Int { return tableViewData.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; 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) -&gt; 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 &amp;&amp; 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 &amp;&amp; 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) -&gt; 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) -&gt; UITableViewCell {but when i try to setoverride func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; 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
Posted Last updated
.
Post not yet marked as solved
3 Replies
459 Views
Hi developers, im doing a framework with this functionpublic func LoginGenerateToken(userName: String, password: String) { let parameters = LoginGenerateTokenStruct(userName: userName, password: password.sha256()) LoginSingleton.shared.mailUserLogin = userName networkManager1 = URL_Session() networkManager1?.delegate = self networkManager1?.LoginGenerateTokenPOST(parameters: parameters) }so when the user install the framework and call this function it should ask for 'userName' and 'password'but it doesn't because is not an static functionthe function get call like thisLoginWS.LoginGenerateToken()insted ofLoginWS.LoginGenerateToken(userName: String, password: String)i can't set static because im calling a delegate outside the func LoginGenerateTokennetworkManager1?.delegate = selfhow could i get the function to work without using static?this is the full code// // LoginWS.swift // IntegradorFrameWork // // Created by BlumonPay on 11/27/19. // Copyright © 2019 BlumonPay. All rights reserved. // import Foundation import CommonCrypto public class LoginWS: URL_SessionDelegate{ var networkManager1: URL_Session? func connectionFinishWithError(session: URL_Session, error: Error) { print(error) } func connectionFinishSuccessfull(session: URL_Session, response: NSDictionary) { print(response) let dictionaryValue = response as? NSDictionary let responseError = dictionaryValue?["error"] as? String let errorDescription = dictionaryValue?["error_description"] as? String if responseError?.count == nil { let dictionaryValue = response as? NSDictionary let tokenAcceso = dictionaryValue?["access_token"] as! String print("Access Token: \(tokenAcceso)") }else{ let responseError = dictionaryValue?["error"] as! String let errorDescription = dictionaryValue?["error_description"] as! String print("ERROR: \(errorDescription)") } } public func LoginGenerateToken(userName: String, password: String) { let parameters = LoginGenerateTokenStruct(userName: userName, password: password.sha256()) LoginSingleton.shared.mailUserLogin = userName networkManager1 = URL_Session() networkManager1?.delegate = self networkManager1?.LoginGenerateTokenPOST(parameters: parameters) } } extension String { func sha256() -&gt; String{ if let stringData = self.data(using: String.Encoding.utf8) { return hexStringFromData(input: digest(input: stringData as NSData)) } return "" } private func digest(input : NSData) -&gt; NSData { let digestLength = Int(CC_SHA256_DIGEST_LENGTH) var hash = [UInt8](repeating: 0, count: digestLength) CC_SHA256(input.bytes, UInt32(input.length), &amp;hash) return NSData(bytes: hash, length: digestLength) } private func hexStringFromData(input: NSData) -&gt; String { var bytes = [UInt8](repeating: 0, count: input.length) input.getBytes(&amp;bytes, length: input.length) var hexString = "" for byte in bytes { hexString += String(format:"%02x", UInt8(byte)) } return hexString } }delegate method@objcprotocol URL_SessionDelegate { func connectionFinishSuccessfull(session: URL_Session, response: NSDictionary) //Response del mismotipo que devuelve el JSON o utilizar any para cachar cualquiera de los 2 func connectionFinishWithError(session: URL_Session, error: Error) @objc optional func connectionFinishSuccessfull2(session: URL_Session, response: NSDictionary) @objc optional func connectionFinishSuccessfull3(session: URL_Session, response: NSDictionary) @objc optional func connectionFinishSuccessfull4(session: URL_Session, response: NSDictionary) } class URL_Session: NSObject, URLSessionDelegate, URLSessionDataDelegate { var dataTask: URLSessionDataTask? //Descarga los bytes, evalua la respuesta del servidor var responseData: Data = Data() //Respuesta del lado del servidor var httpResponse: HTTPURLResponse? static var delegate: URL_SessionDelegate? var delegat2: URL_SessionDelegate? var delegat3: URL_SessionDelegate? var delegat4: URL_SessionDelegate?
Posted Last updated
.
Post marked as solved
4 Replies
1.3k Views
Hi team, i had this issue where my aesDecryt is not enconding to .utf8staticfunc aesDecrypt(_ cadena: String, keySource: [UInt8], closure: @escaping (Bool, Any) -&gt; Void) { let bytesBase64 = Array.init(base64: cadena) if bytesBase64.count &gt; 0 { let llave: Array = Array(keySource[0 ..&lt; 16]) let valor: Array = Array(keySource[16 ..&lt; 32]) let data: Array = Array(bytesBase64[16 ..&lt; bytesBase64.count]) do { let aes = try AES(key: llave, blockMode: CBC(iv: valor), padding: Padding.pkcs5) let aesDecriptado = try aes.decrypt(bytesBase64) if let cadena = String(bytes: aesDecriptado, encoding: .utf8) { closure(true, cadena) print("true response: \(cadena)") } else { closure(false, "Not valid string 1") } } catch { closure(false, "decoding error: \(error).") } } else { closure(false, "Not valid string 1") } }this is how i call my methodlet gID = "sPgFZceJ4Aqc8oiRIVlt8A==" let KeysoruceByte = [112, 98, 90, 244, 255, 107, 76, 169, 120, 30, 16, 181, 121, 82, 54, 172, 122, 60, 165, 73, 8, 73, 169, 152, 209, 233, 67, 115, 77, 124, 47, 6, 111, 114, 197, 11, 58, 25, 3, 39, 203, 76, 155, 206, 195, 60, 176, 164, 251, 77, 54, 138, 6, 120, 43, 13, 43, 43, 16, 124, 64, 97, 179, 188] SecurityMethods.aesDecrypt(gID ?? "", keySource: keySourceByte) { (response, idn) in if response == true { print("responde true") DBManager.shared.deleteIDNEntity() print("este es el idN: \(idn)") if UserSingleton.getInstance().pushToken == ""{ self.firebaseToken.getIdN(self.application, callbackToken: self, cGoogleID: idn as! String) }why this is not a valid Stringi had printed every param in my aes methodbytesBase64: [176, 248, 5, 101, 199, 137, 224, 10, 156, 242, 136, 145, 33, 89, 109, 240]count: 16llave: [112, 98, 90, 244, 255, 107, 76, 169, 120, 30, 16, 181, 121, 82, 54, 172]valor: [122, 60, 165, 73, 8, 73, 169, 152, 209, 233, 67, 115, 77, 124, 47, 6]data: []valor aes CryptoSwift.AESaesdecriptado: [150, 227, 55, 227, 153, 182, 70, 184, 10, 99, 8, 165, 193, 255, 74, 170]
Posted Last updated
.
Post not yet marked as solved
0 Replies
2.1k Views
i had this issue when trying to get the FCMtoken for the second time, when the user accepts the permissions to push notifications he can log into the app properly, but if decide to unregister from the app, he cannot complete the path again, because he cannot get another FCMtokeni already tryed deleting the firebaseApp and get another FirebaseToken// if let token = InstanceID.instanceID().token() { print("Token : \(token)"); UserSingleton.getInstance().pushToken = token } else { print("Error: unable to fetch token"); } Messaging.messaging().shouldEstablishDirectChannel = true print("new token: \(UserSingleton.getInstance().pushToken)") self.dismiss(animated: true, completion: nil) // } } func registerFirebaseToken() { if let token = InstanceID.instanceID().token() { print("FIREBASE: Token \(token) fetched") } else { print("FIREBASE: Unable to fetch token"); } Messaging.messaging().shouldEstablishDirectChannel = true } func unregisterFirebaseToken(completion: @escaping (Bool)-&gt;()) { // Delete the Firebase instance ID InstanceID.instanceID().deleteID { (error) in if error != nil{ print("FIREBASE: ", error.debugDescription); completion(false) } else { print("FIREBASE: Token Deleted"); completion(true) } }when the user unregister from the app this code runs and gives this :5.17.0 - [Firebase/InstanceID][I-IID003009] Failed to fetch default token Error Domain=com.firebase.iid Code=2006 "(null)"this is my FirebaseToken Class:import Foundation import Firebase import UserNotifications import FirebaseInstanceID import FirebaseMessaging @objc protocol CallbackToken { func onGetToken(token: String) } class FirebaseToken: UIResponder { let gcmMessageIDKey = "gcm.message_id" let preferences = UserDefaults.standard var appName = "" var isFistFireConfigured = false var delegate: CallbackToken? func getIdN(_ application: UIApplication, callbackToken:CallbackToken, cGoogleID: String) { delegate = callbackToken if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound] UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: {_, _ in }) } else { let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) application.registerUserNotificationSettings(settings) } application.registerForRemoteNotifications() self.configureApp(googleID: cGoogleID, iOSID: Constants.iOSID, app: Constants.appName) Messaging.messaging().delegate = self } func configureApp(googleID: String, iOSID: String, app: String) { appName = app let fireOptions = FirebaseOptions(googleAppID: String(format: "1:%@:ios:%@", googleID, iOSID), gcmSenderID: googleID) NSLog("FIREBASE APP ID -&gt; %@", fireOptions) NSLog("CONFIGURED APP %@ -&gt; %@", appName, fireOptions) let app = FirebaseApp.app() app?.delete({ (true) in NSLog("Firebase app deleted") }) FirebaseApp.configure(options: fireOptions) } } extension FirebaseToken: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -&gt; Void) { let userInfo = notification.request.content.userInfo if userInfo[gcmMessageIDKey] != nil { NSLog("MESSAGE ID -&gt; %@", self) } NSLog("USER INFO -&gt; %@", userInfo) completionHandler([.alert, .badge, .sound]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -&gt; Void) { let userInfo = response.notification.request.content.userInfo if let messageID = userInfo[gcmMessageIDKey] { print("\n4. Message ID: \(messageID)") } if UIApplication.shared.applicationState == .active { print("Usuario apretó la push cuando la app está activa AppDelegate") print("esto es el mensaje: \(response)") if UserSingleton.getInstance().pushNoti != [:] { if UserDefaults.standard.bool(forKey: "isLogged") == true { UserDefaults.standard.set(true, forKey: "noPresencialForeground") NotificationCenter.default.post(name: NSNotification.Name(rawValue: "noPresencial"), object: nil) } else { UserDefaults.standard.set(true, forKey: "noPresencialForeground") } } else { print("Solo abre la app") } } else if UIApplication.shared.applicationState == .inactive { print("Usuario apretó la push cuando la app está INACTIVA AppDelegate") if UserSingleton.getInstance().pushNoti != [:] { if UserDefaults.standard.bool(forKey: "isLogged") == true { UserDefaults.standard.set(true, forKey: "noPresencialForeground") NotificationCenter.default.post(name: NSNotification.Name(rawValue: "noPresencial"), object: nil) } else { UserDefaults.standard.set(true, forKey: "noPresencialForeground") } } else { print("Solo abre la app") } } completionHandler() } } extension FirebaseToken: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { print("Firebase registration token: \(fcmToken)") UserSingleton.getInstance().pushToken = fcmToken isFistFireConfigured = true preferences.set(fcmToken, forKey: appName) delegate?.onGetToken(token: fcmToken) let didSave = preferences.synchronize() if !didSave { print("Error al sincronizar las preferencias") } if isFistFireConfigured { configureApp(googleID: Constants.googleIDCobroSPEI, iOSID: Constants.iOSID, app: Constants.appNameCobroSPEI) isFistFireConfigured = false } } func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) { print("\nMensaje de datos recibido en primer plano: \(remoteMessage.appData)") } }
Posted Last updated
.