Sunteți pe pagina 1din 10

Ministerul Educației Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică și Microelectronică
Departamentul ISA

Raport
Lucrare de laborator Nr.3
La Programarea Aplicațiilor Mobile

Tema: Organiser Mobile Application

A efectuat:
st. gr. TI-151 FR

A verificat:
lector universitar Antohi Ion

Chișinău 2018
Obiective: De realizat aplicație tip Organiser pe platforma aleasă.
Tema: Priority Tasks
Funcțional: Planificator de sarcini cu priorități
Condiții: Aplicația va conține minim 3 Activități de baza care vor fi numerotate în lucrare sub forma:
1. MainActivity (structura/componente)
- Calendar View (custom or default)
- Buttons (Add/Remove/Update)
- Căutare (caută conform cuvintelor cheie)
2. AddActivity
- Data/Time controller
- Info TextBox
- Buttons și altele (la discreție conform specificului aplicației)
3. UpdateActivity - practic e una și aceeași activitate de la Add, doar ca completată deja.
- Datele operaționale din interiorul aplicației vor fi stocate în fișier/e XML forma cărora rămâne
la discreția personală. (cuvinte cheie, XML Serialization).

Mersul lucrării
1. În fig. 1 este redat aspectul aplicației la prima accesare. În bara de navigare este titlul pentru toate
sarcinile și în colțul drept al barei este un buton de adăugarea unei sarcini noi.

Fig. 1

2. După ce apăsăm butonul de adăugare, apare o fereastră nouă cu un câmp pentru text, o bară de
priorități pentru sarcină și un buton de confirmare și unul de refuz. Vezi fig. 2
Fig. 2

3. O dată ce am scris sarcina, ea va fi afișată în lista de sarcini fig. 3.


Fig. 3

4. Pentru a modifica descrierea sarcinei e nevoie doar de apasat pe sarcină și se va deschide din nou
fereastra pentru editarea sarcinei. Vezi fig. 4 când modifici și fig. 5 după modificare.

Fig. 4
Fig. 5

5. Dacă sarcina a fost împlinită, e nevoie să o bifăm că a fost executată cu succes fig. 6 iar dacă
sarcina nu a fost executată e nevoie să o ștergem fig. 7.

Fig. 6
Fig. 7

Concluzie: Efectuând această lucrare de laborator, am înțeles cum se construiește o aplicație pentru a-ți
organiza sarcinile zilnice după priorități pentru a fi mai productiv. Am înțeles cum de șters un element din
listă și cum de modificat.
Anexa
AddToDo
class AddTodoViewController: UIViewController {

// MARK: - Properties

var managedContext: NSManagedObjectContext!


var todo: Todo?

// MARK: Outlets

@IBOutlet weak var textView: UITextView!


@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var doneButton: UIButton!
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!

override func viewDidLoad() {


super.viewDidLoad()

// Do any additional setup after loading the view.


NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillShow(with:)),
name: .UIKeyboardWillShow,
object: nil
)
textView.becomeFirstResponder()

if let todo = todo {


textView.text = todo.title
textView.text = todo.title
segmentedControl.selectedSegmentIndex = Int(todo.priotity)
}
}

// MARK: Actions

@objc func keyboardWillShow(with notification: Notification) {


let key = "UIKeyboardFrameEndUserInfoKey"
guard let keyboardFrame = notification.userInfo?[key] as? NSValue else { return }

let keyboardHeight = keyboardFrame.cgRectValue.height + 16

bottomConstraint.constant = keyboardHeight

UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}

fileprivate func dismissAndResign() {


dismiss(animated: true)
textView.resignFirstResponder()
}

@IBAction func cancel(_ sender: UIButton) {


dismissAndResign()
}

@IBAction func done(_ sender: UIButton) {


guard let title = textView.text, !title.isEmpty else {
return
}

if let todo = self.todo {


todo.title = title
todo.priotity = Int16(segmentedControl.selectedSegmentIndex)
} else {
let todo = Todo(context: managedContext)
todo.title = title
todo.priotity = Int16(segmentedControl.selectedSegmentIndex)
todo.date = Date()
}

do {
try managedContext.save()
dismissAndResign()
} catch {
print("Error saving todo: \(error)")
}
}
}

extension AddTodoViewController: UITextViewDelegate {


func textViewDidChangeSelection(_ textView: UITextView) {
if doneButton.isHidden {
textView.text.removeAll()
textView.textColor = .white

doneButton.isHidden = false

UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
}
}

TodoTable
class TodoTableViewController: UITableViewController {

// MARK: - Properties

var resultsController: NSFetchedResultsController<Todo>!


let coreDataStack = CoreDataStack()

override func viewDidLoad() {


super.viewDidLoad()
// Request
let request: NSFetchRequest<Todo> = Todo.fetchRequest()
let sortDescriptors = NSSortDescriptor(key: "date", ascending: true)

// Init
request.sortDescriptors = [sortDescriptors]
resultsController = NSFetchedResultsController(
fetchRequest: request,
managedObjectContext: coreDataStack.managedContext,
sectionNameKeyPath: nil,
cacheName: nil
)
resultsController.delegate = self

// Fetch
do {
try resultsController.performFetch()
} catch {
print("Perform fetch error: \(error)")
}
}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return resultsController.sections?[section].numberOfObjects ?? 0
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->


UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell", for: indexPath)

// Configure the cell...


let todo = resultsController.object(at: indexPath)
cell.textLabel?.text = todo.title

return cell
}

// MARK: - Table view delegate

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt


indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view,
completion) in
// TODO: Delete todo
let todo = self.resultsController.object(at: indexPath)
self.resultsController.managedObjectContext.delete(todo)
do {
try self.resultsController.managedObjectContext.save()
completion(true)
} catch {
print("delete failed: \(error)")
completion(false)
}
}
action.image = imageLiteral(resourceName: "trash")
action.backgroundColor = .red

return UISwipeActionsConfiguration(actions: [action])


}

override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt


indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let action = UIContextualAction(style: .destructive, title: "Check") { (action, view,
completion) in
let todo = self.resultsController.object(at: indexPath)
self.resultsController.managedObjectContext.delete(todo)
do {
try self.resultsController.managedObjectContext.save()
completion(true)
} catch {
print("delete failed: \(error)")
completion(false)
}
}
action.image = imageLiteral(resourceName: "check")
action.backgroundColor = .green

return UISwipeActionsConfiguration(actions: [action])


}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


performSegue(withIdentifier: "ShowAddTodo", sender: tableView.cellForRow(at: indexPath))
}

// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before


navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let _ = sender as? UIBarButtonItem, let vc = segue.destination as? AddTodoViewController {
vc.managedContext = resultsController.managedObjectContext
}
if let cell = sender as? UITableViewCell, let vc = segue.destination as? AddTodoViewController
{
vc.managedContext = resultsController.managedObjectContext
if let indexPath = tableView.indexPath(for: cell) {
let todo = resultsController.object(at: indexPath)
vc.todo = todo
}
}
}
}

extension TodoTableViewController: NSFetchedResultsControllerDelegate {


func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {


tableView.endUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject:


Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
if let indexPath = newIndexPath {
tableView.insertRows(at: [indexPath], with: .automatic)
}
case .delete:
if let indexPath = indexPath {
tableView.deleteRows(at: [indexPath], with: .automatic)
}
case .update:
if let indexPath = indexPath, let cell = tableView.cellForRow(at: indexPath) {
let todo = resultsController.object(at: indexPath)
cell.textLabel?.text = todo.title
}
default:
break
}
}
}

S-ar putea să vă placă și