【问题标题】:MonoTouch.Dialog : Advanced EditingMonoTouch.Dialog : 高级编辑
【发布时间】:2011-03-15 18:53:21
【问题描述】:

我正在尝试组合一个可编辑的详细视图,类似于 iPhone 默认联系人应用程序。

我有一个联系人表格视图,并在选择单元格时激活一个可编辑的详细信息视图:

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

我要更改的行为在 ConfigEdit 方法中。当我第一次显示视图时,编辑部分中的元素应该是 StringElements。当我切换到编辑模式时,元素应更改为条目元素,因为我希望能够删除行或编辑元素内的文本。

这可能吗?在设置编辑模式之前,是否有更好的方法来显示只读元素?

【问题讨论】:

    标签: xamarin.ios monotouch.dialog


    【解决方案1】:

    你有几个选择:

    一个。您可以使用更新的 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

    【讨论】:

      【解决方案2】:

      根据 Miguel 的回答,这是我所做的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2020-05-29
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多