我有一个显示模型对象数据的基本表视图控制器,让我们调用该对象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是否应该对模型对象一无所知,只是调用主表视图控制器的委托,然后修改模型对象?
答案 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];
}
}
我试图坚持使用相似的名字,但你很可能会更多地概括这一点