【问题标题】:passing data/objects/moc between viewcontrollers - best practice在视图控制器之间传递数据/对象/moc - 最佳实践
【发布时间】:2011-11-24 16:21:50
【问题描述】:

我有一个我怀疑很常见的场景,我在回答其他类似问题时发现了各种想法,包括设置 IBOutlets、将 NSmanagedobjects 作为属性传递以及只使用一个视图控制器但交换视图,但我不确定哪个是为我的解决方案实施的最佳想法。

我有一个具有典型模型的 iOS/iphone 应用程序。 UITabBarController 包含多个 UINavigationControllers。

在其中一个导航控制器中,我有一个带有 tableView 的视图控制器。这个 tableView 是从获取的核心数据实体中填充的,称为“标签”。当我使用 UIBarButtonItem (Add) 设置 tableView 时,添加按钮的行为如下:我需要它为该实体创建一个新的“标签”对象,并用一些已知数据填充该对象,然后提示用户钻取向下 3 级分类(区域 -> 区域 -> 主题)到达一个主题对象。然后我需要将该“主题”对象添加到原始新添加的“标签”对象的关系中(堆栈下方的 3 个视图)。 - 希望这很清楚。

(有很多代码我不确定要呈现哪些位,所以我现在用主要的 sn-p 来描述,一定要让我知道你想看到的任何特定代码。)

- (void)addTag {    

NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[newManagedObject setValue:@"(untitled)" forKey:@"tagID"];

NSError *error;
if (![context save:&error])
    NSLog(@"Error saving entity: %@", [error localizedDescription]);


ChooseRegion *aView = [[[ChooseRegion alloc] init] autorelease];
aView.theTag = newManagedObject;

[self.navigationController pushViewController:aView animated:YES];

}

您可以看到我已经创建了对象,将其中一个属性设置为值,保存并将对象传递给下一个视图 (chooseRegion),这是 3 个视图中的第一个。在每个 didSelectRowAtIndexPath 代码上,将选定的行和这个“标签”对象传递给下一个视图,我不确定这是否正确,因为我不确定当我到达第三个视图的主题对象时该怎么做? ??我迷路了。

给猫剥皮总是不止一种方法,但我应该从什么方法来解决这个问题。我应该将“标签”对象向前传递并将其保存在第三个视图中,还是将所选主题传回并将其保存在创建“标签”对象的原始视图中?

非常感谢。

【问题讨论】:

    标签: objective-c core-data uiviewcontroller properties uinavigationcontroller


    【解决方案1】:

    我会为此使用通知。通知是一种将应用程序的各个部分解耦的简单方法,但它们仍然可以协同工作。

    在您的情况下,当用户在第三个视图中选择标签对象时,我会发送这样的通知:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"tagSelected" object:myTag];
    

    现在,在具有“添加”按钮的控制器中,使其订阅该事件:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTagSelected:) name:@"tagSelected" object:nil];
    

    确保你实现了 handleTagSelected: 方法,并且在该方法中你可以获取标签对象并关闭你打开的向下钻取视图:

    - (void)handleTagSelected:(NSNotification *)notification {
        Tag *mytag = (Tag *)notification.object;
        [self dismissModalViewControllerAnimated:YES];
    }
    

    然后你可以对标签做任何你想做的事情。

    【讨论】:

    • 感谢@eduardo,我以前没有使用过 NSNotifcations - 我会阅读一下,看看我是怎么做的。我想我有几个问题要解决,比如如果用户从未真正到达 postNotification 时的默认行为是什么,观察者是否只是坐着听直到卸载,我什么时候应用 removeObserver 等等 - 我会玩。 - 感谢您抽出宝贵时间提出您的想法。
    • 我想我会尝试的方法是从 UIBarButtonAdd 按钮开始向下钻取(无需先创建
    • 哎呀! - 我想我会尝试的方法是从列表视图上的 UIBarButtonAdd 按钮开始向下钻取(无需先创建新对象)允许使用跟随向下钻取 VC 并在用户选择结束时传递 UserInfo 中的主题对象的 postnotification 主题。带有 UIButtonBarAdd 的 VC 将在 viewDidLoad 中设置观察并在 viewDidUnload 中删除观察。 HandleTopicSelected: 方法将创建新对象填充它并保存上下文。听起来怎么样?我只剩下如何关闭 3VC 以让用户返回列表视图。
    • 我使用 NSNotifications 实现了这个 - 哇,多么强大的工具!非常感谢@eduardo。
    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2012-01-27
    • 2019-11-20
    • 2011-07-09
    相关资源
    最近更新 更多