Xamarin.ios 对话框:高级编辑
我正在尝试创建一个可编辑的详细视图,类似于iPhone默认联系人应用程序 我有一个联系人的表格视图,当选择单元格时,我会激活一个可编辑的详细信息视图:Xamarin.ios 对话框:高级编辑,xamarin.ios,monotouch.dialog,Xamarin.ios,Monotouch.dialog,我正在尝试创建一个可编辑的详细视图,类似于iPhone默认联系人应用程序 我有一个联系人的表格视图,当选择单元格时,我会激活一个可编辑的详细信息视图: public override void Selected (DialogViewController dvc, UITableView tableView, NSIndexPath path) { var editingSection = new Section ("Entity") { new Strin
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。切换到编辑模式时,元素应更改为条目元素,因为我希望能够删除行或编辑元素内的文本
这可能吗?在设置编辑模式之前,是否有更好的方法显示只读元素?您有两个选项: a。您可以使用更新的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
您可以做的另一件事是创建一个新元素,该元素可以基于此信息切换状态。我的博客有一个关于如何创建新元素的教程:
根据米格尔的回答,以下是我所做的:
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);
}
}
}