0

我觉得问这个很无知,因为我知道这很简单。目标:离开后在视图上保留一个变量,然后返回它。

例如:假设我们有MainViewCategoryView和 (drumroll) ProjectView

应用程序打开到MainView它显示一个表 - 用户选择他们想要选择一个类别。这将它们转移到CategoryView。一旦做出选择,我将选择的类别发送回MainView。通过

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

这里没问题。MainView 接收变量并将所选类别显示为“类别”部分中的子文本。接下来,用户想要选择一个项目名称(这也是一个预定义的列表),他们选择项目,然后我将变量发送回 MainView。

- 现在有人可以(温和地)向我解释为什么当我返回主视图时,以前持有“选择”类别的 NSString 变量现在为空?

所以我的 NSString selectedProject 没有被正确保留?我应该在这里做什么正确的实现?或者我错过了什么?我真的很想了解发生了什么,所以任何事情都会有很大帮助。

主视图界面

    @interface MainViewController : UIViewController {
        NSString *selectedProjectName;
        NSString *selectedCategory;
    }

    @property (nonatomic, retain) NSString *selectedProjectName;
    @property (nonatomic, retain) NSString *selectedCategory;

    @end

主视图实现

    @implementation MainViewController
    @synthesize selectedCategory, selectedProjectName;

如果你需要它.. ProjectView 实施

  -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"masterSegue"]) {
    MainViewController *vc = (MainViewController *)[segue destinationViewController];

    LogValues *lv = [LogValues alloc];

    lv.project = @"Test Project Name";
    vc.selectedProjectName = lv.project;
    } 
    }
4

2 回答 2

0

好的,您的问题是您没有返回到同一个实例。你错过了关于 segue 的一件非常重要的事情——它们总是实例化新的视图控制器。因此,当您使用模态转场“返回”到主视图控制器时,您只是在创建该控制器的新实例。您永远不应该使用展开 segue 以外的任何东西在故事板中倒退(到早期的控制器)。展开是关于 segue 总是创建新实例的规则的例外。

所以,你有2个选择。您可以使用 unwind segue,这很好,因为您仍然可以实现 prepareForSegue 将数据发送回目标控制器,或者您根本不能使用 segue,并使用 dismissViewControllerAnimated:completion: 返回,并使用委托发回数据。

于 2013-05-16T03:28:41.110 回答
-1

因此,当然,在发布后我会立即看到一个我认为有帮助的帖子。解决方案是将值存储在运行良好的AppDelegate中。

但是,我觉得还有其他方法可以实现相同的结果,而不必依赖 AppDelegate,并且很想听听其他解决方案。

于 2013-05-16T02:21:15.357 回答