Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I pass data into MonoTouch.Dialog's delegates?

Given the following code, how can I pass data from "First Name", "Last Name", etc. into my method BookASession.SendMessage();?

RootElement CreateBookASessionRoot() 
{
    return new RootElement("Book a Session") {
        new Section() {
            new EntryElement("First Name", "First Name", ""),
            new EntryElement("Last Name", "Last Name", ""),
            new EntryElement("Email", "Email", "") { KeyboardType = UIKeyboardType.EmailAddress },
            new DateElement("Event Date", DateTime.Now),
            new RootElement ("Type of Shoot", new RadioGroup (0)){
                    new Section (){
                        new RadioElement("Wedding"),
                    new RadioElement("Portrait"),
                    new RadioElement("Boudoir"),
                    new RadioElement("Other")
                    }
            } ,
            new EntryElement("Message", "Message", "")
        } ,
        new Section () {
            new StringElement("Send", delegate { BookASession.SendMessage(); } )
        }
    };                      
}       
like image 472
Brian David Berman Avatar asked Feb 23 '23 04:02

Brian David Berman


2 Answers

The way i like to accomplish this is by keeping references to my input elements. This way i can easily fetch their input values without having to search through the entire element tree. I'm doing so by encapsulating the creation logic for a particular screen in a separate clase, like this:

public class BookASessionScreen
{
    private RootElement _root = null;

    private EntryElement _firstName = null;

    private EntryElement _lastName = null;

    private EntryElement _email = null;

    private DateElement _date = null;

    private RootElement _typeOfShoot = null;

    private EntryElement _message = null;

    private void CreateRoot()
    {
        _firstName = new EntryElement("First Name", "First Name", "");
        _lastName = _firstName = new EntryElement("First Name", "First Name", "");
        _email = new EntryElement("Email", "Email", "") { KeyboardType = UIKeyboardType.EmailAddress };
        _date = new DateElement("Event Date", DateTime.Now);
        _typeOfShoot = new RootElement ("Type of Shoot", new RadioGroup (0)){
            new Section () {
                new RadioElement("Wedding"),
                new RadioElement("Portrait"),
                new RadioElement("Boudoir"),
                new RadioElement("Other")
            }
        };
        _message = new EntryElement("Message", "Message", "");

        _root = new RootElement("Book a Session") {
            new Section() {
                _firstName,
                _lastName,
                _email,
                _date,
                _typeOfShoot,
                _message
            } ,
            new Section () {
                new StringElement("Send", delegate { 
                    //BookASession.SendMessage(_firstName.Value, _lastName.Value, ...)
                })
            }
        };
    }

    public RootElement Root 
    {
        get {
            if (_root == null) {
                CreateRoot();
            }
            return _root;
        }
    }
}

Also, you may want to decouple the form processing logic by having the class expose an event, like this:

1 - Create a class that will hold the event data, extending EventArgs:

public class BookASessionArgs : EventArgs
{
    public string FirstName
    {
        get;
        set;
    }

    public string LastName
    {
        get;
        set;
    }

    public string Email
    {
        get;
        set;
    }
}

2 - Declare your event in BookASessionScreen:

public event EventHandler BookASession;

3 - Fire the event in your delegate

if (BookASession != null) {
    BookASession(this, new BookASessionArgs() {
        FirstName = _firstName.Value,
        LastName = _lastName.Value
        //..
    });
}
like image 126
AlexB Avatar answered Mar 05 '23 10:03

AlexB


The problem with the value properties not getting updated can be solved by calling the method ResignFirstResponder on the element that has focus. I guess this is something iOS specific.

like image 32
Nicolas Büchert Avatar answered Mar 05 '23 12:03

Nicolas Büchert