IOS中的即时/自动保存

Posted

技术标签:

【中文标题】IOS中的即时/自动保存【英文标题】:Instant / Autosave in IOS 【发布时间】:2012-11-13 12:55:00 【问题描述】:

背景说明:在我的日常工作中,我是一名 Windows 自动化和数据翻译“专家”(或者他们说 grins)。自从我在 2004 年购买了我的第一台 Mac 以来,我一直在不断地涉足 Objective-C 编码。

我正在开发一个 ios 应用程序。我的数据容器类知道如何从磁盘保存和加载,每个对象都响应-(void)saveToImpliedFilename-(void)save:(NSString *)filename 的实例方法。有一个静态调用来从存储中加载数据文件并从中创建不同的数据对象(它们是相当轻量级的对象,所以我不担心一次加载几个)。该应用程序的域如此之大,以至于其中许多都不会一次加载。

+(NSArray *)loadData 

这一切都很好。在存储中,对象以 Xml 形式存储,并且寿命很好。

我在尝试修改教程时遇到了麻烦,这样我会发生两件事:

快速说明:我将本教程用作 POC 编码的基础,然后我将返回并从“真实”编码重新开始,重用我的数据对象和我的其他一些实用程序我们一直在建造。

这是我的目标和问题清单:

    我希望表格视图告诉数据对象在几乎每个“编辑”事件中保存。我唯一能一直工作的就是重新组织桌子的顺序。 (保存按钮和添加新条目可以正常工作)

    在列表中输入一个新条目会创建一个漂亮的模态编辑器,其中包含一个保存和取消按钮,效果非常好。但是,如果我编辑现有条目,则无法重现保存按钮的行为。每次我尝试时,按钮的事件都不再触发。我不知道我哪里错了。

我使用本教程系列中的“可编辑表格视图”项目作为我的基础:http://www.aboutobjects.com/community/iphone_development_tutorial/tutorial.html

在下面的代码中,[self isModal] 测试是让保存/取消按钮可见并连接起来的地方。调出新条目屏幕显然是它唯一的模态。我尝试将这些东西连接起来,以便始终创建按钮,但同样,事件永远不会为任何一个触发。下面的下一个块是使用 NEW 功能显式调用可编辑表视图的地方,但同一表视图的非模态视图由选择器表上的选择事件调用。

所以...

// code snipped for the new/modal editor

- (void)viewDidLoad 
    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    //  If the user clicked the '+' button in the list view, we're
    //  creating a new entry rather than modifying an existing one, so
    //  we're in a modal nav controller. Modal nav controllers don't add
    //  a back button to the nav bar; instead we'll add Save and
    //  Cancel buttons.
    //
    if ([self isModal]) 
        UIBarButtonItem *saveButton = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemSave
                                       target:self
                                       action:@selector(save)];

        [[self navigationItem] setRightBarButtonItem:saveButton];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]
                                         initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
                                         target:self
                                         action:@selector(cancel)];

        [[self navigationItem] setLeftBarButtonItem:cancelButton];
    
    // do stuff here to display my object...    



// this code is called from the selection table to explicitly add a new data object. 

- (void)add 

    vhAddVehicleViewController *controller = [[vhAddVehicleViewController alloc] initWithStyle:UITableViewStyleGrouped];

    id vehicle = [[Vehicle alloc] init];
    [controller setVehicle:vehicle];
    [controller setListcontroller:self];

    UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:controller];

    [[self navigationController] presentViewController:newNavController animated:YES completion:nil];




// this is where it's called on the table selection to show the same view without the save/cancel buttons.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    vhAddVehicleViewController *controller = [[vhAddVehicleViewController alloc] initWithStyle:UITableViewStyleGrouped];

    NSUInteger index = [indexPath row];
    id vehicle = [[self vehicles] objectAtIndex:index];

    [controller setVehicle:vehicle];
    [controller setTitle:[vehicle Vehiclename]];

    [[self navigationController] pushViewController:controller animated:YES];

我假设问题在于呈现它会使其成为模态,而推动它不会......?没关系。但是当我对模态进行测试以尝试使按钮保持工作时,我感到很高兴。轻按时按钮会绘制并单击,但不会触发事件。

哈哈! :-) 非常感谢。 -- Chris(我使用我的 Google 帐户登录,所以在页面顶部我显示为“user1820796”)耸耸肩

【问题讨论】:

【参考方案1】:

你忘了打电话给[super viewDidLoad];

【讨论】:

我显然不清楚。保存/编辑方法不是问题。问题似乎是推动视图控制器使其成为非模态的,就像 PRESENTING 一样,从而使按钮显示并工作。然而,当我通过简单地跳过 [... isModal] 检查来愚弄它时,按钮会绘制和添加,但不会发送事件。我说得有道理吗?这令人沮丧。谢谢。 我想我很理解你的问题。您发布的- (void)viewDidLoad 没有调用[super viewDidLoad],因此您可能缺少 UIKit 应该为您执行的重要流程(包括事件处理)。首先添加[super viewDidLoad] 调用,然后告诉我们它是如何工作的。 行为没有变化。非常令人沮丧。只需注释掉对模式的检查,就会按预期绘制按钮。运行时我没有收到错误或零警告,按钮具有有效的指针地址。存在要调用的事件,并且此代码在模态调用时工作得很好。我真的很困惑。 认为我掌握了它。谢谢。 (答案在下面)【参考方案2】:

更新

尝试在视图控制器时移除左侧的取消按钮。看看保存是否开始工作。我认为问题是当视图控制器被按下时你不应该向导航栏添加左键。

您使用的是哪种方法签名?

- (void)save

    NSLog(@"Saving");

或者

- (void)save:(id)sender

    NSLog(@"Saving");

【讨论】:

我有方法。当编辑器表是非模态时,这就是问题所在。否则,我无法保存编辑。 (编辑是:编辑现有对象。添加新对象可以正常工作。) 我没有看到他们,所以我以为他们不在那里。我根据您的评论编辑了答案。 明白了。是的,我担心用太多代码向帖子发送垃圾邮件。对不起:\ 我错过了你说的“尝试删除取消按钮”的部分。我会看看那个。我没有考虑到这一点。谢谢。 在不改变控制器的显示方式的情况下,我找不到一种方法来做到这一点。最终,我所做的总是使编辑表控制器成为模态,就好像我正在添加一个新条目一样,只需使用先前选择的数据对象填充表单,并在关闭 tableview 表单时保存数据对象。我还取消了一堆在下一步/完成按钮逻辑中很棘手的行为。如果你没有从第一场开始,我会觉得马虎。您不能跳到表格/表格的中间并开始编辑现有字段而不制动它。感谢您的帮助【参考方案3】:

我仍然认为这与推送/弹出视图有关,而不是呈现视图。我将其全部切换为演示文稿,它现在按我想要的方式工作。

感谢大家的帮助。与我在 GUI 方面所习惯的范式完全不同,但我做到了。

谢谢!

【讨论】:

以上是关于IOS中的即时/自动保存的主要内容,如果未能解决你的问题,请参考以下文章

自动保存标签中的信息并在 iOS 中切换

jquery 自动完成 自动补全 实时搜索 实时查询 即时搜索 即时 查询

iOS 6 状态保存和恢复的自动化测试

iOS 13 UIActivityViewController 在图像保存后自动呈现以前的 VC

iOS:监控电池电量使用更多电池?应该自动保存吗?

ios怎么把webm保存到相册