Actualización Readme

main
Juan David Lopez Regalado 1 month ago
parent e701f66cb8
commit ea5b250776

@ -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
}
```

@ -7,7 +7,7 @@
<key>RK-Journals.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
<integer>5</integer>
</dict>
</dict>
</dict>

@ -3,7 +3,6 @@
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23084"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@ -12,8 +11,7 @@
<!--Intro View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
<viewController id="BYZ-38-t0r" customClass="IntroViewController" sceneMemberID="viewController">
<viewController id="BYZ-38-t0r" customClass="IntroViewController" customModule="RK_Journals" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -21,10 +19,11 @@
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
<connections>
<segue destination="B7d-i6-kuM" kind="custom" identifier="toConsent" id="TbN-Vd-3aC"/>
<segue destination="JfP-LC-owM" kind="custom" identifier="toTasks" id="nyl-qu-GeR"/>
<segue destination="B7d-i6-kuM" kind="custom" identifier="toConsent" customClass="IntroSegue" customModule="RK_Journals" customModuleProvider="target" id="TbN-Vd-3aC"/>
<segue destination="JfP-LC-owM" kind="custom" identifier="toTasks" customClass="IntroSegue" customModule="RK_Journals" customModuleProvider="target" id="nyl-qu-GeR"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-1260" y="56"/>
</scene>
@ -51,13 +50,14 @@
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pj0-Qw-cYF">
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pj0-Qw-cYF">
<rect key="frame" x="60" y="191" width="273" height="35"/>
<fontDescription key="fontDescription" type="system" pointSize="23"/>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<state key="normal" title="Unirse al estudio">
<color key="titleColor" name="AccentColor"/>
</state>
<state key="normal" title="Unirse al estudio"/>
<connections>
<action selector="joinButtonTapped:" destination="B7d-i6-kuM" eventType="touchUpInside" id="cn6-pJ-GUo"/>
</connections>
</button>
</subviews>
<viewLayoutGuide key="safeArea" id="Sil-rc-UTE"/>
@ -76,9 +76,6 @@
</scene>
</scenes>
<resources>
<namedColor name="AccentColor">
<color red="0.0" green="0.46000000000000002" blue="0.89000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>

@ -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
}

@ -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) {
}
*/
}

@ -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()
}
}

@ -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)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Loading…
Cancel
Save