diff --git a/README.md b/README.md index ca5a9a1..3ce4b5d 100644 --- a/README.md +++ b/README.md @@ -100,8 +100,168 @@ y se guardará en la misma ruta del archivo, como viene predeterminado. ![](imagenes/savefile.png) -al termino de los 3 archivos, deberálucir de la siguiente forma: +al termino de los 3 archivos, deberá lucir de la siguiente forma: ![](imagenes/allVC.png) +### Direccionamiento de los segues + +Además de los ViewController se creará un archivo de igual tipo Cocoa Touch Class, sin embargo, este llevará por nombre **IntroSegue** y la subclase será un **UIStoryboardSegue**, y al igual que los demás lo guardamos en la carpeta del proyecto. + +![](imagenes/Intro.png) + +Dentro de este archivo, colocaremos el siguiente código, el cuál implementa un segue que reemplaza un controlador hijo por otro de manera completamente personalizada, eliminando el controlador antiguo de la jerarquía y añadiendo el nuevo. Esto es útil si quieres hacer transiciones en las que no se empuje o presente una nueva vista de manera estándar, sino que se reemplace un controlador específico dentro de una vista ya existente. + +``` +import UIKit + +class IntroSegue: UIStoryboardSegue { + + override func perform() { + let controllerToReplace = source.children.first + let destinationControllerView = destination.view + + destinationControllerView?.translatesAutoresizingMaskIntoConstraints = true + destinationControllerView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] + destinationControllerView?.frame = source.view.bounds + + controllerToReplace?.willMove(toParent: nil) + source.addChild(destination) + + source.view.addSubview(destinationControllerView!) + controllerToReplace?.view.removeFromSuperview() + + destination.didMove(toParent: source) + controllerToReplace?.removeFromParent() + } +} +``` +y dentro del inspector, en los 2 segues que están en el Main.storyboard, se asigna la clase como *IntroSegue* + +![](imagenes/segues1.png) +![](imagenes/segues2.png) + +y para asegurarnos que se realicen las transiciones automáticas hacia los diferentes ViewController a través de los segues ya definidos, en el archivo de IntroViewController se realizará el codigo siguiente: + +``` +import UIKit + +class IntroViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + toConsent() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + func toConsent(){ + performSegue(withIdentifier: "toConsent", sender: self) + } + + func toTasks(){ + performSegue(withIdentifier: "toTasks", sender: self) + } +} + +``` + +Es momento de correr el programa, para verificar que todo este funcionando bien y esté libre de errores, debería abrir la pantalla del consentimiento. + + +![](imagenes/join.png) + +### Uso del botón **Unirse al estudio** + +Para darle funcionalidad al botón anteriormente creado, se dirigirá al archivo Main.storyboard y se arrastrará con click derecho del mouse, del botón hasta el archivo ConsentViewController, en la parte inferior; ya que ahí es donde se podráque es lo que se quiere realizar al presionar el botón. + + +![](imagenes/button1.png) + +para identificarlo se le pondra de nombre **joinButtonTapped** y el tipo será un **UIButton** + +![](imagenes/button2.png) + +El código que se agregará es el siguiente: + +``` + @IBAction func joinButtonTapped(_ sender: UIButton) { + } + +``` + +Para crear el documento de consentimiento, es necesario crear un archivo de tipo Swift File, con el nombre **ConsentDocument**, donde se podrán poner todo lo relacionado y que se requiera para que se visualice el consentimiento y el usuario pueda firmarlo. + +![](imagenes/document1.png) +![](imagenes/document2.png) + +el archivo creado debe estar vacío, unicamente con una linea de código que dice + +``` +import Foundation +``` + +en el archivo creado, se colocará un código base, donde indique que partes tendrá el consentimiento: + +``` +import Foundation +import ResearchKit + +public var ConsentDocument: ORKConsentDocument{ + + let consentDocument = ORKConsentDocument() + consentDocument.title = "Introducción a ResearchKit" // O título de tu preferencia + + // Tipos de secciones + let sectionTypes: [ORKConsentSectionType] = [ + .overview, + .dataGathering, + .privacy, + .dataUse, + .timeCommitment, + .studySurvey, + .studyTasks, + .withdrawing + ] + + // Contenido de las secciones + let text = [ + "Sección 1: Bienvenido. Este estudio trata sobre...", + "Sección 2: Recopilación de datos. Este estudio recopilará datos...", + "Sección 3: Privacidad. Valoramos su privacidad...", + "Sección 4: Uso de datos. Los datos recopilados se utilizarán para...", + "Sección 5: Compromiso de tiempo. Este estudio le llevará aproximadamente...", + "Sección 6: Encuesta del estudio. Para este estudio, deberá completar una encuesta...", + "Sección 7: Tareas del estudio. Se le solicitará que realice estas tareas...", + "Sección 8: Retiro. Para retirarse del estudio..." + ] + + // Agregar Secciones + for sectionType in sectionTypes { + let section = ORKConsentSection(type: sectionType) + + let localizedText = NSLocalizedString(text[sectionTypes.firstIndex(of: sectionType)!], comment: "") + let localizedSummary = localizedText.components(separatedBy: ".")[0] + "." + + section.summary = localizedSummary + section.content = localizedText + + if consentDocument.sections == nil { + consentDocument.sections = [section] + } else { + consentDocument.sections!.append(section) + } + } + + // Firmar Consentimiento + consentDocument.addSignature(ORKConsentSignature(forPersonWithTitle: "Participante", dateFormatString: nil, identifier: "ConsentDocumentParticipantSignature")) + + return consentDocument +} + +``` diff --git a/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate b/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate index 4bdeb3c..0d0001c 100644 Binary files a/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate and b/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist b/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist index 6c387e3..b4df92d 100644 --- a/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ RK-Journals.xcscheme_^#shared#^_ orderHint - 0 + 5 diff --git a/RK-Journals/RK-Journals/Base.lproj/Main.storyboard b/RK-Journals/RK-Journals/Base.lproj/Main.storyboard index 3d6b016..2d4a3da 100644 --- a/RK-Journals/RK-Journals/Base.lproj/Main.storyboard +++ b/RK-Journals/RK-Journals/Base.lproj/Main.storyboard @@ -3,7 +3,6 @@ - @@ -12,8 +11,7 @@ - - + @@ -21,10 +19,11 @@ - - + + + @@ -51,13 +50,14 @@ - @@ -76,9 +76,6 @@ - - - diff --git a/RK-Journals/RK-Journals/ConsentDocument.swift b/RK-Journals/RK-Journals/ConsentDocument.swift new file mode 100644 index 0000000..47fb8c1 --- /dev/null +++ b/RK-Journals/RK-Journals/ConsentDocument.swift @@ -0,0 +1,59 @@ +// +// ConsentDocument.swift +// RK-Journals +// +// Created by Juan David Lopez Regalado on 11/11/24. +// + +import Foundation +import ResearchKit + +public var ConsentDocument: ORKConsentDocument { + + let consentDocument = ORKConsentDocument() + consentDocument.title = "Introducción a ResearchKit" // O título de tu preferencia + + // Tipos de secciones y sus contenidos + let sectionTypes: [ORKConsentSectionType] = [ + .overview, + .dataGathering, + .privacy, + .dataUse, + .timeCommitment, + .studySurvey, + .studyTasks, + .withdrawing + ] + + let text = [ + "Sección 1: Bienvenido. Este estudio trata sobre...", + "Sección 2: Recopilación de datos. Este estudio recopilará datos...", + "Sección 3: Privacidad. Valoramos su privacidad...", + "Sección 4: Uso de datos. Los datos recopilados se utilizarán para...", + "Sección 5: Compromiso de tiempo. Este estudio le llevará aproximadamente...", + "Sección 6: Encuesta del estudio. Para este estudio, deberá completar una encuesta...", + "Sección 7: Tareas del estudio. Se le solicitará que realice estas tareas...", + "Sección 8: Retiro. Para retirarse del estudio..." + ] + + // Crear secciones y añadirlas al documento de consentimiento + var sections: [ORKConsentSection] = [] + + for (index, sectionType) in sectionTypes.enumerated() { + let section = ORKConsentSection(type: sectionType) + let localizedText = NSLocalizedString(text[index], comment: "") + let localizedSummary = localizedText.components(separatedBy: ".")[0] + "." + + section.summary = localizedSummary + section.content = localizedText + sections.append(section) + } + + consentDocument.sections = sections + + // Agregar la firma de consentimiento + let signature = ORKConsentSignature(forPersonWithTitle: "Participante", dateFormatString: nil, identifier: "ConsentDocumentParticipantSignature") + consentDocument.addSignature(signature) + + return consentDocument +} diff --git a/RK-Journals/RK-Journals/ConsentViewController.swift b/RK-Journals/RK-Journals/ConsentViewController.swift index 92fca7c..167e28e 100644 --- a/RK-Journals/RK-Journals/ConsentViewController.swift +++ b/RK-Journals/RK-Journals/ConsentViewController.swift @@ -15,15 +15,8 @@ class ConsentViewController: UIViewController { // Do any additional setup after loading the view. } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. + @IBAction func joinButtonTapped(_ sender: UIButton) { } - */ + } diff --git a/RK-Journals/RK-Journals/IntroSegue.swift b/RK-Journals/RK-Journals/IntroSegue.swift new file mode 100644 index 0000000..cd137d6 --- /dev/null +++ b/RK-Journals/RK-Journals/IntroSegue.swift @@ -0,0 +1,28 @@ +// +// IntroSegue.swift +// RK-Journals +// +// Created by Juan David Lopez Regalado on 11/11/24. +// +import UIKit + +class IntroSegue: UIStoryboardSegue { + + override func perform() { + let controllerToReplace = source.children.first + let destinationControllerView = destination.view + + destinationControllerView?.translatesAutoresizingMaskIntoConstraints = true + destinationControllerView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] + destinationControllerView?.frame = source.view.bounds + + controllerToReplace?.willMove(toParent: nil) + source.addChild(destination) + + source.view.addSubview(destinationControllerView!) + controllerToReplace?.view.removeFromSuperview() + + destination.didMove(toParent: source) + controllerToReplace?.removeFromParent() + } +} diff --git a/RK-Journals/RK-Journals/IntroViewController.swift b/RK-Journals/RK-Journals/IntroViewController.swift index 5749c69..4e1257b 100644 --- a/RK-Journals/RK-Journals/IntroViewController.swift +++ b/RK-Journals/RK-Journals/IntroViewController.swift @@ -11,19 +11,20 @@ class IntroViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. + // Do any additional setup after loading the view, typically from a nib. + toConsent() } - - /* - // MARK: - Navigation + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. + func toConsent(){ + performSegue(withIdentifier: "toConsent", sender: self) } - */ + func toTasks(){ + performSegue(withIdentifier: "toTasks", sender: self) + } } diff --git a/imagenes/Intro.png b/imagenes/Intro.png new file mode 100644 index 0000000..abc32ab Binary files /dev/null and b/imagenes/Intro.png differ diff --git a/imagenes/button1.png b/imagenes/button1.png new file mode 100644 index 0000000..fe65017 Binary files /dev/null and b/imagenes/button1.png differ diff --git a/imagenes/button2.png b/imagenes/button2.png new file mode 100644 index 0000000..4ef5978 Binary files /dev/null and b/imagenes/button2.png differ diff --git a/imagenes/document1.png b/imagenes/document1.png new file mode 100644 index 0000000..300ca74 Binary files /dev/null and b/imagenes/document1.png differ diff --git a/imagenes/document2.png b/imagenes/document2.png new file mode 100644 index 0000000..a1b6f87 Binary files /dev/null and b/imagenes/document2.png differ diff --git a/imagenes/join.png b/imagenes/join.png new file mode 100644 index 0000000..5c838f2 Binary files /dev/null and b/imagenes/join.png differ diff --git a/imagenes/segues1.png b/imagenes/segues1.png new file mode 100644 index 0000000..74c1a64 Binary files /dev/null and b/imagenes/segues1.png differ diff --git a/imagenes/segues2.png b/imagenes/segues2.png new file mode 100644 index 0000000..59f87ad Binary files /dev/null and b/imagenes/segues2.png differ