gpt4 book ai didi

ios - 使用相同的 View Controller 进行添加、显示和编辑

转载 作者:可可西里 更新时间:2023-11-01 04:42:49 26 4
gpt4 key购买 nike

我正在开发一个 iOS 应用程序,它使用非常常见的基于 Core Data 的表格 View 来显示项目,当它选择一个项目时,它会显示更详细的 View ,就像联系人应用程序一样。详细 View 本身是一个以编程方式生成的分组表,带有一个自定义(nib 定义的) View ,用于包含图片和名称的标题。表格中的一些单元格是具有标签名称和文本框值的自定义单元格。在“编辑”模式下,可编辑表格单元格(以及标题中的名称)将 .clearButtonMode 设置为 UITextFieldViewModeAlways 以表明它们是可编辑的。

我目前正在使用相同的 View Controller 来显示详细信息、编辑信息以及向原始列表添加新记录。

当添加新项目时, View Controller 以模式方式创建,带有自定义初始化重载,在 View Controller 中设置一个标志以指示它正在添加记录。这允许它以编辑模式启动,如果离开编辑模式,模型 View 将被删除。右边的菜单栏按钮是通常的编辑/完成按钮,左边的是取消按钮。编辑现有项目时,左侧按钮(正常后退按钮)将替换为取消按钮。

我开始重新考虑让一个 View Controller 处理三种不同模式是否可行。有几个问题我不确定如何处理。

1) 如何通过点击“完成”来判断是否离开了编辑模式?有行动吗?如果取消被击中, Action 要么自行解除(添加模式),要么恢复以前的值离开编辑模式。我想我可以检查我的 setEditing 覆盖来处理它,但似乎应该有更好的方法。

2) 当进入编辑模式并且我将可编辑文本字段设置为 UITextFieldViewModeAlways 时,有没有办法为“X”按钮的外观设置动画,以便它们随着常规单元格上的编辑指示器淡入?

这些问题是否有简单的解决方案,或者我的三合一 View Controller 是个坏主意吗?为不同的模式重新制作相同的 View 似乎是不对的,但是 View Controller 具有多种模式似乎有点麻烦。

乔吉

最佳答案

我喜欢三合一的方法并且一直在使用它。有很多优点:一个 xib,一个 View Controller ,列表和详细 View Controller 之间的一个简单协议(protocol)。是的,还有一些检查,例如 if (self.editing) ... 但我更喜欢它而不是更多的 View Controller 和 xib。

为了帮助添加,我公开了一个委托(delegate)可以设置的 BOOL。

@property (nonatomic) BOOL adding;

1) 内置的editButtonItem 不允许你在setEditing:animated 之前拦截它:当你在点击Done 之后进行数据验证时,这是有问题的。出于这个原因,我很少使用 editButtonItem 并使用我自己的 Edit、Done 和 Cancel 按钮以及它们自己的操作方法。见下文。

2) 为此,我喜欢 UITableView 的 reloadSections:withRowAnimation。它可能适用于您的情况。

- (void)edit:(id)sender 
{
self.editing = YES;
}
- (void)done:(id)sender
{
// data validation here
if (everythingChecksOut)
{
//save here
} else {
return; //something didn't validate
}

//if control reaches here all is good
//let the delegate know what happened...
if (self.adding) {
[self.delegate didFinishAddingWithData:self.yourData];
} else {
[self.delegate didFinishEditingWithData:self.yourData];
}

self.adding = NO;
self.editing = NO;
}
- (void)cancel:(id)sender
{
[self.view endEditing:YES]; //in theory, forces the view that is editing to resign first responder
//in practise I find it doesn't work with the YES parameter and I have to use my own flag

// roll back any changes here

self.editing = NO;

if (self.adding) //let the delegate know we cancelled the add...
{
[self.delegate didCancelAdd];
}
}
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
[super setEditing:editing animated:animated];

//set your nav bar title
[self.tableview.editing = editing]; //you may or may not require this
[self.tableview reloadSections... withRowAnimation:yourChoice];

if (editing)
{
//install your Done and Cancel buttons
} else {
//remove Cancel and put the Edit button back
}
}

然后在viewDidLoad...

- (void)viewDidLoad
{
[super viewDidLoad];

//whatever else you do

if (self.adding)
{
self.editing = YES;
}
}

关于ios - 使用相同的 View Controller 进行添加、显示和编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com