0

我有一个显示模型对象数据的基本表视图控制器,我们称之为 object userInfo。每个单元格都连接到不同的视图控制器,用户可以在其中修改userInfo属性。一个属性是数组names。数组中的每个name都显示在单个表格部分中。名称单元格连接到一个简单的视图控制器,其中包含一个文本字段来编辑name或添加name到数组中。

这是一个非常简单的概念,但我看到了几种不同的实现方式。我想使用最符合 MVC 设计的最干净的方法。

在我当前的实现中 prepareForSegue

if ([segue.identifier isEqualToString:@"EditName"]) {
        EditNameVC *controller = segue.destinationViewController;
        controller.userInfo = self.userInfo;
        NSArray *names = [self.userInfo objectForKey:@"names"];
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *nameInfo = [names objectAtIndex:indexPath.row];
        NSString *name = [nameInfo objectForKey:@"title"];
        if (name) {
            controller.name = name;
        }
    }

我通过isEditingBOOL 告诉 Edi​​tNameVcnameInfo字典将被替换而不是添加到array. 这在目标视图控制器中提出了一个问题。如果编辑 a name,vc如何知道替换字典的索引?我应该在 EditNameVC 中创建一个私有属性oldNameObject,遍历每个nameInfoinsnames并使用replaceObjectIdenticalTo吗?我应该通过 indexPath 吗?任何一种选择都显得草率。

作为另一个考虑,EditTableVC 是否应该对模型对象一无所知,只是调用主表视图控制器的委托,然后修改模型对象?

4

1 回答 1

1

要使用块完成来执行此操作,您需要执行...

在编辑 viewController (你推的那个)中,你需要声明一个块指针

@interface YourClass : UIViewController

// some properties
@property (nonatomic, copy) void (^onCompletion)(NSString *editedName);

@end

然后在实现中,您需要在调用完成操作时调用此块:

- (void)doneTapped;
{
  if (self.onCompletion) {
    self.onCompletion(self.editedName);    
  }
}

现在您需要做的就是在您推动此控制器的位置设置回调

if ([segue.identifier isEqualToString:@"EditName"]) {
  // Create and set up controller

  controller.onCompletion = ^(NSString *editedString) {
    [self.navigationController popViewControllerAnimated:YES];

    // do whatever you want with the edited string
    // If names was mutable

    [names replaceObjectAtIndex:indexPath.row withObject:editedString];
  }
}

我试图坚持使用相似的名称,但您很可能会更概括这一点

于 2012-12-03T22:25:44.570 回答