Multiple Views And Access To XML Files With .NET For iOS

When creating applications for iOS, it is important to manage various views or windows, which allow our application to be distributed at different levels of operation. In this example, we will make an application with .NET for iOS and XCode Interface Builder that allows the recording of data of a file in XML format, and that can be consulted in another view.

To do so, it is essential to have the knowledge of creating an application for .NET for iOS, as I explain in the following article, which I recommend observing before making the current one:

Step 1

We create a .NET for iOS application in Visual Studio for Mac and add three new ViewController files called ExtractViewController, PrincipalViewController, and RegisterViewController, removing the XIBs files since we will be using a Storyboard, which we will add to the project with the name Main.

Multiple views and access to XML files with .NET for iOS

Step 2

We added 3 images, which will serve as the background for each of the 3 views of the application.

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Step 3

We open in Visual Studio for Mac, our Main.Storyboard with the XCode Interface Builder, and add 3 View Controllers.

Multiple views and access to XML files with .NET for iOS

Step 4

We assign the class PrincipalView to the first view and set it as Home View.

Multiple views and access to XML files with .NET for iOS

Step 5

We add an ImageView that occupies the entire view

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Step 6

In the image attributes, in the Image property, we select Image1.jpg, and its Content Mode is set to Scale to Fill.

Multiple views and access to XML files with .NET for iOS

Step 7

We add two buttons, Register and Extract to the view. From there, we select with the right mouse button the Triggered Segues called action, we take it and drag it to the second view, from the floating menu we select Present Modally, generating the connection line, and once selected in its attributes, in the Transition property we select Cover Vertical.

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Step 8

We do the same process for the other button, now pointing to the third view. In the end, we select the Flip Horizontal value as Transition.

Multiple views and access to XML files with .NET for iOS

Step 9

In the second view, we proceed to connect your Custom Class with the RegisterViewController.

Multiple views and access to XML files with .NET for iOS

Step 10

We add an ImageView that covers the entire screen and select Image2.jpg.

Multiple views and access to XML files with .NET for iOS

Step 11

In the third view, we proceed to connect your Custom Class with ExtractViewController.

Multiple views and access to XML files with .NET for iOS

Step 12

We add an ImageView that covers the entire screen and select Image3.jpg.

Multiple views and access to XML files with .NET for iOS

Step 13

In views two and three, we added a button with the text Return to Main.

Multiple views and access to XML files with .NET for iOS

Step 14

We do the same process, but now in the opposite direction, the Return to the Main button will take us to the main view.

Multiple views and access to XML files with .NET for iOS

Step 15

Now we proceed to add the necessary TextField in view two corresponding to the fields we want to capture.

Multiple views and access to XML files with .NET for iOS

Step 16

We add their placeholder, and we are placing them on the screen:

Multiple views and access to XML files with .NET for iOS

Step 17

We add a button and assign the properties we want to it.

Multiple views and access to XML files with .NET for iOS

Step 18

We do the same process for view 3.

Multiple views and access to XML files with .NET for iOS

Step 19

Now that we have the elements of the Graphic Interface ready, we proceed to make the link with the names that each of the objects on the screen will have.

Multiple views and access to XML files with .NET for iOS

Step 20

In view two, let's ensure we're doing the Referencing Outlets with the RegisterViewController.h file.

Multiple views and access to XML files with .NET for iOS

Step 21

Each element must have its corresponding variable and name. (Note: Do not forget to consult the article Create Apps for iOS with .NET 7 in case you do not remember how to make the bindings)

Multiple views and access to XML files with .NET for iOS

Step 22

We do the same process in view 3, which is the ExtractViewController.

Multiple views and access to XML files with .NET for iOS

Step 23

In Visual Studio for Mac, we proceed to prepare the main window, with the setting of the PublicPrincipalView(IntPrt handle):base(handle).

Multiple views and access to XML files with .NET for iOS

Step 24

We comment the code from AppDelegate.cs, let's not forget to also add Main as the starting Storyboard in the Info.plist.

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Step 25

We confirm that the RegisterViewController.designer.cs contains the visual objects we made in the XCode.

Multiple views and access to XML files with .NET for iOS

Step 26

We do the same process in the ExtractViewController.

Multiple views and access to XML files with .NET for iOS

Step 27

We run the application to confirm the operation of our graphical interface.

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Multiple views and access to XML files with .NET for iOS

Step 28

We generate a class called Info.cs, where we add the fields that we want to save in our XML file.

using System;
namespace iOSNETVariasVistasXML
{
	public class Info
	{
        public int ID;
        public string Name;
        public string Address;
        public string Mail;
        public int Age;
        public double Balance;
    }
}

Step 29

We add the System.Xml.Serialization library that we will use in the RegisterViewController. Later in the ViewDidLoad, we enable the Touch of the button, and we create the instance of the Info.cs class and we receive the values of the elements of the graphical interface. Later we generate the variable of serialization of the XML file with the structure of the Info.cs class, we prepare the route with a StreamWriter, allowing us to create the file in that format. We proceed to serialize it with the information of the DC variable, having the route and the information that the user entered in the Graphical Interface. We close the serializer and send a message to the screen whose method we will create below, and clear the text boxes.

using System.Xml.Serialization;
namespace iOSNETVariasVistasXML;
public partial class RegisterViewController : UIViewController
{
    public RegisterViewController(IntPtr handle) : base(handle)
    {
    }
    public override void ViewDidLoad ()
	{
		base.ViewDidLoad ();
        btnSave.TouchUpInside += delegate
        {
            var DC = new Info();
            try
            {
                DC.ID = int.Parse(txtID.Text);
                DC.Name = txtName.Text;
                DC.Address = txtAddress.Text;
                DC.Mail = txtMail.Text;
                DC.Age = int.Parse(txtAge.Text);
                DC.Balance = double.Parse(txtBalance.Text);
                var WriteXML = new XmlSerializer(typeof(Info));
                var serializer = new StreamWriter
                    (Path.Combine(System.Environment.GetFolderPath
                    (System.Environment.SpecialFolder.Personal),
                    txtID.Text + ".xml"));
                WriteXML.Serialize(serializer, DC);
                serializer.Close();
                MessageBox("Save on iPhone", "File XML");
                txtID.Text = "";
                txtName.Text = "";
                txtAddress.Text = "";
                txtMail.Text = "";
                txtAge.Text = "";
                txtBalance.Text = "";
            }
            catch (Exception ex)
            {
                MessageBox("Error: ", ex.Message);
            }
        };
    }
}

Step 30

We create the method for the message on the screen using the iOS AlertController.

public static void MessageBox(string Title, string Message)
{
    var Alerta = UIAlertController.Create(Title, Message,
        UIAlertControllerStyle.Alert);
    Alerta.AddAction(UIAlertAction.Create("Done",
        UIAlertActionStyle.Default, null));
    var Instancia = UIApplication.SharedApplication.Windows[1].
        RootViewController;
    Instancia.PresentViewController(Alerta, true, null);
}

Step 31

In the ExtractViewController file, we add the same System.Xml.Serialization library, enable the Touch of the button and create the instance of the Info.cs class, we enable the read variable with the serializer and a StreamReader and generate the path where the file is stored. We read the file through the deserialization of the XmlSerializer, extract the information from each variable, and deposit it in the user's text boxes. Finally, we add the Messabox method with the AlertController.

using System.Xml.Serialization;
namespace iOSNETVariasVistasXML;
public partial class ExtractViewController : UIViewController
{
    public ExtractViewController(IntPtr handle) : base(handle)
    {
    }
    public override void ViewDidLoad ()
	{
		base.ViewDidLoad ();
        btnExtract.TouchUpInside += delegate
        {
            var DC = new Info();
            try
            {
                var Lectura = new XmlSerializer(typeof(Info));
                var serializador = new StreamReader
                    (Path.Combine(System.Environment.GetFolderPath
                    (System.Environment.SpecialFolder.Personal),
                    txtID.Text + ".xml"));
                var info = (Info)Lectura.Deserialize
                    (serializador);
                serializador.Close();
                txtName.Text = info.Name;
                txtAddress.Text = info.Address;
                txtMail.Text = info.Mail;
                txtAge.Text = info.Age.ToString();
                txtBalance.Text = info.Balance.ToString();
            }
            catch (Exception ex)
            {
                MessageBox("Error: ", ex.Message);
            }
        };
    }
}

Complete Code

using System;
namespace iOSNETVariasVistasXML
{
	public class Info
	{
        public int ID;
        public string Name;
        public string Address;
        public string Mail;
        public int Age;
        public double Balance;
    }
}
using System.Xml.Serialization;
namespace iOSNETVariasVistasXML;
public partial class RegisterViewController : UIViewController
{
    public RegisterViewController(IntPtr handle) : base(handle)
    {
    }
    public override void ViewDidLoad ()
	{
		base.ViewDidLoad ();
        btnSave.TouchUpInside += delegate
        {
            var DC = new Info();
            try
            {
                DC.ID = int.Parse(txtID.Text);
                DC.Name = txtName.Text;
                DC.Address = txtAddress.Text;
                DC.Mail = txtMail.Text;
                DC.Age = int.Parse(txtAge.Text);
                DC.Balance = double.Parse(txtBalance.Text);
                var WriteXML = new XmlSerializer(typeof(Info));
                var serializer = new StreamWriter
                    (Path.Combine(System.Environment.GetFolderPath
                    (System.Environment.SpecialFolder.Personal),
                    txtID.Text + ".xml"));
                WriteXML.Serialize(serializer, DC);
                serializer.Close();
                MessageBox("Save on iPhone", "File XML");
                txtID.Text = "";
                txtName.Text = "";
                txtAddress.Text = "";
                txtMail.Text = "";
                txtAge.Text = "";
                txtBalance.Text = "";
            }
            catch (Exception ex)
            {
                MessageBox("Error: ", ex.Message);
            }
        };

    }
    public static void MessageBox(string Title, string Message)
    {
        var Alerta = UIAlertController.Create(Title, Message,
            UIAlertControllerStyle.Alert);
        Alerta.AddAction(UIAlertAction.Create("Done",
            UIAlertActionStyle.Default, null));
        var Instancia = UIApplication.SharedApplication.Windows[1].
            RootViewController;
        Instancia.PresentViewController(Alerta, true, null);
    }
}
using System.Xml.Serialization;
namespace iOSNETVariasVistasXML;
public partial class ExtractViewController : UIViewController
{
    public ExtractViewController(IntPtr handle) : base(handle)
    {
    }
    public override void ViewDidLoad ()
	{
		base.ViewDidLoad ();
        btnExtract.TouchUpInside += delegate
        {
            var DC = new Info();
            try
            {
                var Lectura = new XmlSerializer(typeof(Info));
                var serializador = new StreamReader
                    (Path.Combine(System.Environment.GetFolderPath
                    (System.Environment.SpecialFolder.Personal),
                    txtID.Text + ".xml"));
                var info = (Info)Lectura.Deserialize
                    (serializador);
                serializador.Close();
                txtName.Text = info.Name;
                txtAddress.Text = info.Address;
                txtMail.Text = info.Mail;
                txtAge.Text = info.Age.ToString();
                txtBalance.Text = info.Balance.ToString();
            }
            catch (Exception ex)
            {
                MessageBox("Error: ", ex.Message);
            }
        };
    }
    public static void MessageBox(string Titulo, string Mensaje)
    {
        var Alerta = UIAlertController.Create(Titulo, Mensaje,
            UIAlertControllerStyle.Alert);
        Alerta.AddAction(UIAlertAction.Create("OK",
            UIAlertActionStyle.Default, null));
        var Instancia = UIApplication.SharedApplication.Windows[1].
            RootViewController;
        Instancia.PresentViewController(Alerta, true, null);
    }
}

Step 32

We run and got ready. We have an iPhone application using .NET for iOS that locally stores a record in XML and queries it using different views on our Storyboard.

Thank you very much.
@enriqueaguilar


Similar Articles