Core Data – Swift 3

Voiam sa fac un articol detaliat despre cum pot folosi Core Data in Swift3. Plecand de la acest articol unde este explicat motivul pentru care a fost introdus NSPersistentContainer in IOS 10, am ajuns la un material care explica extraordinar cat de versatila este utilizarea Core Data in IOS 10 si Swift 3.




Ca si observatie, pentru a nu aparea surprize atunci cand este folosit numele clasei in atributul forEntityName
let student:Student = NSEntityDescription.insertNewObject(forEntityName: "Student", into: DatabaseController.getContext()) as! Student
este recomandata definirea numelor claselor astfel:
let studentClassName:String = String(describing: Student.self)
let courseClassName:String = String(describing: Course.self)

Observatia este facuta la minutul 51:50.

Share Button

SQLite – Swift3

Ca si solutie de persistenta, pe langa Core Data si NSUserDefault, IOS utilizaza SQLite. Nu insist pe povesti despre SQLite, insa fiind disponibil si pe Android, am considerat oportuna folosirea lui.
Pe Swift, pentru a folosi SQLite e nevoie de un wrapper, o aplicatie de background care sa parseze cererile din aplicatie catre SQLite.
Solutii disponibile in acest sens: FMDB sau SQLite Swift.
Pentru un cod suplu al aplicatiei este de recomandat construirea unui wrapper propriu, de fapt a unui set de functii care vor apela comenzi SQL.
Cum folosim SQLite in Swift?

1. In General Setting specificam faptul ca vom lega libsqlite3.tbd la aplicatie.


2. Adaugam un header file la proiect care va permite bridging catre API-ul C al lui SQLite. Numim de exemplu BridgingHeader.h acest header file si includem in el
#include

3. In Build Settings specificam faptul ca vom folosi acest bridge. Pentru aceasta, adaugam in sectiunea “Objective-C Bridging Header” header file pe care l-am generat la pasul 2.



4. Aplicatia noastra este pregatita in acest moment pentru a folosi SQLite.

In urmatorul post voi detalia calea prin care voi defini modelul pe care il voi folosi pentru a putea “executa” comenzi SQL

Share Button

Localizarea unei aplicatii IOS – cazul 1

Se da o aplicatie IOS. Butoane, label-uri “scrise” in limba de baza – base language. Se cere, de un ipotetic client, ca aplicatia sa fie disponibila in … olandeza de exemplu.
Cum procedam?
1. Introducem un nou fisier in proiect – String File si il denumim Localizable




2. Fisierul nostru va fi disponibil sub numele de Localizable.strings. Adaugam in cadrul proiectului limba olandeza pentru ca Xcode sa stie ca proiectul nostru are localizare si pentru aceasta limba. Pentru aceasta Localization -> click pe + si selectam limba dorita.


3. Deschidem fisierul nostru de stringuri – Localizable.strings – si in File Inspector observam un meniu nou “Localization” cu un buton “Localize” pe care trebuie sa-l activam. Aceasta sectiune isi schimba continutul, avand in mod predefinit Base – bifat. Activam si limba pe care tocmai am adaugat-o in proiect si in acest moment fisierul nostru Localizable.strings devine folder cu doua inputuri – Localizable.strings (Base) si Localizable.strings (Dutch).

Cum folosim localizarea mai sus configurata?

Avem de exemplu un label “Cancel”. Acesta va trebui sa fie etichetat cu “Annuleer” in olandeza.

1. In fisierul Localizable.strings (Base) adaugam:
cancelButton = "Cancel";
iar in Localizable.strings (Dutch)
cancelButton = "Annuleer";
acesta este stringul pe care-l vom folosi functie de ce localizare are telefonul userului

2. definim un string localizat de forma in fisierul nostru in care avem IBOutlet-ul catre buton:
let cancelBtn = NSLocalizedString("cancelButton", comment: "Cancel")

3. Definim un AlertAction – de exemplu – care va fi etichetat functie de localizare
let cancel = UIAlertAction(title: cancelBtn, style: .Cancel, handler: {
(alert: UIAlertAction) -> Void in
Log.d("Cancel");
});

4. Command+R

Share Button

Profanity list – Swift3

Adium pentru IOS are un plugin special pentru filtrarea cuvintelor urate – profanity list – care in schimb e foarte Objective C.
Am modelat in playground o clasa speciala de Regular Expression prin intermediul careia filtrez continutul unui dictionar. Ideea de baza este de aici

var badWordDictionary: [String : String] = [
"cuvant1" : "*******",
"cuvant2" : "*******",
"cuvant3" : "*******",
"cuvant4" : "*******",
"cuvant5" : "*******",
"cuvant6" : "*******",
]
var bannedWords = badWordDictionary.keys
var bannedPattern = bannedWords.joined(separator: "|")
var badWordPattern = "\\b(?:\(bannedPattern))\\b"

class MeetMeBadWordRegularExpression: NSRegularExpression {
override func replacementString(for result: NSTextCheckingResult, in string: String, offset: Int, template templ: String) -> String {
let matchingRange = result.range
let matchingWord = (string as NSString).substring(with: matchingRange)
if let replacedWord = badWordDictionary[matchingWord] {
return replacedWord
} else {
return "*"
}
}
}

Apoi vom folosi astfel:

var bodyMessage = "acesta este cuvant1"
let regex = try! MeetMeBadWordRegularExpression(pattern: badWordPattern, options: [])
let clearBodyMessage = regex.stringByReplacingMatches(in: bodyMessage as! String, options: [], range: NSRange(0..<(bodyMessage as! String).utf16.count), withTemplate: "") print("clean message - \(clearBodyMessage)")

Vom avea clean message - acesta este *******

Share Button

Ascunderea separatorului de 1px aflat sub UINavigationBar – Swift3

Deranjant uneori, separatorul dintre View-ul principal si UINavigationBar aparut in IOS 7 poate fi scos prin adaugarea acestui cod in AppDelegate -> application: didFinishLaunchingWithOptions:

UINavigationBar.appearance().setBackgroundImage(
UIImage(),
forBarPosition: .Any,
barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()

Share Button