prepareForSegue和MVC设计

时间:2012-12-03 19:11:21

标签: objective-c model-view-controller uitableview segue

我有一个显示模型对象数据的基本表视图控制器,让我们调用该对象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;
        }
    }

我传递isEditing BOOL告诉EditNameVc将替换nameInfo字典,而不是添加到array。这在目标视图控制器中出现问题。如果编辑name,vc将如何知道替换字典的索引?我应该在EditNameVC oldNameObject中创建一个私有属性,循环浏览每个nameInfo ins names并使用replaceObjectIdenticalTo吗?我应该传递indexPath吗?这两种选择看起来都很草率。

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

1 个答案:

答案 0 :(得分: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];
  }
}

我试图坚持使用相似的名字,但你很可能会更多地概括这一点