2

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

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

+(NSArray *)loadData {}

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

我遇到麻烦的地方是尝试修改教程时,我会发生两件事:

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

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

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

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

我使用本教程系列中的“可编辑表视图”项目作为我的基础: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”)耸了耸肩

4

3 回答 3

0

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

谢谢各位帮忙。与我在 GUI 上所习惯的范式完全不同,但我已经到了那里。

谢谢!

于 2012-11-14T15:34:22.743 回答
0

你忘了打电话[super viewDidLoad];

于 2012-11-13T13:37:49.703 回答
0

更新

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

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

- (void)save
{
    NSLog(@"Saving");
}

或者

- (void)save:(id)sender
{
    NSLog(@"Saving");
}
于 2012-11-13T13:13:29.233 回答