MonoTouch.Dialog: Advanced Editing

I am trying to put together a detailed view that can be changed, similar to the default iPhone contacts application.

I have a TableView of contacts, and I activate an editable detail view when I select a cell:

public override void Selected (DialogViewController dvc, UITableView tableView, NSIndexPath path)
{       
    var editingSection = new Section ("Entity") {
        new StringElement ("First name", "enter", _entity.FirstName),
        new StringElement ("Last name", "enter", _entity.LastName)
    };

    var root = new RootElement("Entity Entry") {
        editingSection
    };

    var entityEdit = new EntityEdit (root, true);
    ConfigEdit (entityEdit);            
    dvc.ActivateController(entityEdit);

}

void ConfigEdit (DialogViewController dvc)
{
    dvc.NavigationItem.RightBarButtonItem = new UIBarButtonItem (UIBarButtonSystemItem.Edit, delegate {
        dvc.TableView.SetEditing (true, true);
        ConfigDone (dvc);
    });
}

void ConfigDone (DialogViewController dvc)
{
    dvc.NavigationItem.RightBarButtonItem = new UIBarButtonItem (UIBarButtonSystemItem.Done, delegate {
        dvc.TableView.SetEditing (false, true);
        ConfigEdit (dvc);
    });
}

The behavior I want to change is the ConfigEdit method. When I first show the view, the elements in the edit section should be StringElements. When I switch to edit mode, the elements must change to input elements because I want to delete a line or edit the text inside the element.

Is it possible? Is there a better approach to showing read-only items until editing mode is set?

+3
source share
2

:

. RootElement RootElement , . , :

RootElement CreateRoot (bool editable)
{
    return new RootElement (...) {
         CreateEditableElement ("foo", bar, editable)
    }
}

Element CreateEditableElement (string caption, string content, bool editable)
{
     return editable ? EntryElement (caption, content) : StringELement (caption, content)
}

ReloadData , "".

, , , . , :

http://tirania.org/monomac/archive/2011/Jan-18.html

+6

, :

public partial class AppDelegate
{       
    public void DemoAdvancedEditing () 
    {
        var root = new RootElement ("Todo list") {
            new Section() {
                new StringElement ("1", "Todo item 1"),
                new StringElement ("2","Todo item 2"),
                new StringElement ("3","Todo item 3"),
                new StringElement ("4","Todo item 4"),
                new StringElement ("5","Todo item 5")
            }
        };
        var dvc = new AdvancedEditingDialog (root, true);
        AdvancedConfigEdit (dvc);           
        navigation.PushViewController (dvc, true);
    }

    void AdvancedConfigEdit (DialogViewController dvc)
    {
        dvc.NavigationItem.RightBarButtonItem = new UIBarButtonItem (UIBarButtonSystemItem.Edit, delegate {
            // Activate editing
            // Switch the root to editable elements     
            dvc.Root = CreateEditableRoot(dvc.Root, true);
            dvc.ReloadData();   
            // Activate row editing & deleting
            dvc.TableView.SetEditing (true, true);
            AdvancedConfigDone(dvc);                
        });
    }

    void AdvancedConfigDone (DialogViewController dvc)
    {
        dvc.NavigationItem.RightBarButtonItem = new UIBarButtonItem (UIBarButtonSystemItem.Done, delegate {
            // Deactivate editing
            dvc.ReloadData();
            // Switch updated entry elements to StringElements
            dvc.Root = CreateEditableRoot(dvc.Root, false);
            dvc.TableView.SetEditing (false, true);
            AdvancedConfigEdit (dvc);
        });
    }

    RootElement CreateEditableRoot (RootElement root, bool editable)
    {
        var rootElement = new RootElement("Todo list") {
            new Section()
        };

        foreach (var element in root[0].Elements) {
            if(element is StringElement) {
                rootElement[0].Add(CreateEditableElement (element.Caption, (element as StringElement).Value, editable));
            } else {
                rootElement[0].Add(CreateEditableElement (element.Caption, (element as EntryElement).Value, editable));
            }
        }

        return rootElement;
    }

    Element CreateEditableElement (string caption, string content, bool editable)
    {
        if (editable) {
            return new EntryElement(caption, "todo", content);
        } else {
            return new StringElement(caption, content);
        }
    }
}
0

All Articles