Pointers iOS6中在子ViewController之间传递指针时出现问题

Pointers iOS6中在子ViewController之间传递指针时出现问题,pointers,ios6,Pointers,Ios6,我的问题是iOS 6标签应用程序。我正在进行的工作有5个选项卡,几个选项卡是其他视图控制器的网关。大多数页面都需要访问模型对象,该对象包含以数组、字符串等形式存储的数据。裸体模型在运行时填充,用户可以在整个应用程序生命周期中添加到该模型中。例如,下面列出的代码来自我的AppDelegate文件,它将指向裸体模型的指针传递给项目视图控制器。这很好:选项卡应用程序使用导航控制器数组堆栈;因为我知道项目页面位于索引2,所以我可以将模型发送给它 我的问题与项目页面的子视图有关。例如,作为项目页面的子视图

我的问题是iOS 6标签应用程序。我正在进行的工作有5个选项卡,几个选项卡是其他视图控制器的网关。大多数页面都需要访问模型对象,该对象包含以数组、字符串等形式存储的数据。裸体模型在运行时填充,用户可以在整个应用程序生命周期中添加到该模型中。例如,下面列出的代码来自我的AppDelegate文件,它将指向裸体模型的指针传递给项目视图控制器。这很好:选项卡应用程序使用导航控制器数组堆栈;因为我知道项目页面位于索引2,所以我可以将模型发送给它

我的问题与项目页面的子视图有关。例如,作为项目页面的子视图,有(或应该有)一个文件IO页面,用户在其中处理文件操作。文件IO页还需要访问模型对象。但是,当我尝试将模型指针从项目页面发送到文件IO页面时,我以前使用的技术(从AppDelegate发送到项目)不起作用。我指向FileIO ViewController中的一个空模型

示例代码:这在AppDelegate中,工作正常:项目ViewController中的裸体模型填充了数据

        //To the Project View Controller...
UINavigationController *project_NavigationController =
[[tabBarController viewControllers] objectAtIndex:2];
Project_ViewController *project_ViewController =
[[project_NavigationController viewControllers] objectAtIndex:0];
//This hides the navigation bar on the project page but it also removes the bar on any subsequent pages! They need to be programmmatically reset in ViewDidLoad.
[project_NavigationController setNavigationBarHidden:YES animated:YES];
project_ViewController.currentGeoModel = newGeoModel;
现在,我的Project_ViewController嵌入到NavigationController中,并有4个子ViweController。其中一个名为FileIO_ViewController。我想将currentModel从Project_ViewController传递到FileIO_ViewController。在-(void)viewdiload方法下,我尝试了许多不起作用的方法。比如说,

UINavigationController *project_NavigationController = (UINavigationController *) self.presentedViewController;
FileIO_ViewController *fileIO_ViewController = [[project_NavigationController viewControllers] objectAtIndex:1];
fileIO_ViewController.currentModel = currentModel;
编译,但当我尝试访问FileIO_ViewController方法中的currentModel时,它是空的

如果有人能抽出时间帮忙,我将非常感激。对我来说,最好的答案是以显式代码示例的形式,显示如何将指向像我的模型这样的对象的指针从一个ViewController传递到另一个ViewController,而您不明确知道子VC在堆栈中的位置。(在我的示例中,我使用了索引1,但实际上我不知道FileIO_ViewController位于哪个索引,因为我在项目_ViewController下还有三个其他ViewController。我尝试了几个整数,但都没有成功。)

如果你回答这个问题,请考虑我是一个新的家伙当谈到iOS 6和目标C -攀登苹果一直是一个长途,我也没有任何地方接近顶端!p> 谢谢

蒂姆·雷德菲尔德
挪威

如果你的应用程序有一个共享的单一模型,你不应该主动地传递指针,你应该让模型从一个位置可用,并让单个对象在需要时访问同一模型。模型指针的好位置在应用程序委托中

在appDelegate的.h文件中,声明模型的属性:

  //appDelegate.h

  @property (nonatomic, strong) MyAppModel* appModel;
在appDelegate中实例化模型后,只需将其分配给属性:

   //appDelegate.m

  - (BOOL)application:(UIApplication *)application 
           didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.appModel  = [[MyAppModel alloc] init];
    //set up bare-bones appModel here
    return YES;
}

然后,您可以从需要模型数据的任何viewController访问此属性,因此:

#import appDelegate.h;

AppDelegate* appDelegate = [UIApplication sharedApplication] delegate;
MyModel* model = appDelegate.model
(更好的做法是,将模型对象设置为自己的对象,但使用appDelegate可以让您开始)

如果需要传递模型,则需要注意将模型传递给正确的对象。这就是您现有代码被破坏的地方。例如,您正在对NavigationController堆栈的结构进行许多假设。但是,每当您通过从顶部弹出控制器而向下移动堆栈时,您就会完全丢失顶部控制器实例。当您通过在堆栈上向前“返回”到该控制器时,实际上会创建一个新实例(除非您注意保持指针悬空并确保推到该指针)。如果您在这方面需要更多帮助,则需要准确描述应用程序的布局,以及如何创建ViewController、navigationController堆栈等

更新(根据您的评论)

如果您对模型的更改在整个应用程序中都有效,那么我不明白为什么您不能在需要时通过appDelegate.model从应用程序中的任何位置访问模型。如果您有模型的并发版本,您可以考虑创建一个singleton data manager对象,该对象可以处理存储模型数组(或模型历史)的细节,并根据请求提供正确的模型。原理是一样的——与其主动将模型对象传递到ViewController中,不如让它们根据需要从集中的源请求数据

关于您的描述“现在,我的Project_ViewController嵌入到NavigationController中,并且有4个子ViewController”,我认为您还没有完全理解类、情节提要场景和实例之间的区别

在故事板的一部分中有这样的安排:

UINavigationController
       |                    push                     push                     push
       |->UIViewController1 -----> UIViewController2 -----> UIViewController3 ----->
                            segue                    segue                    segue
您讨论的是通过访问NavController的堆栈直接将数据从VC1(比如)传递到VC3

你需要考虑的是故事板描述了一个模板,展示了实例在实例化时是如何相互关联的。它们不会仅仅因为故事板已加载而被实例化。当您到达VC1时,将在模板中展示切换到VC2和VC3的能力,但在您启动切换之前,VC2和VC3(作为实例)都不存在。segue进程实例化其destinationViewController,因此将数据从VC1直接传递到VC3是没有意义的。当您在VC1时,navController的堆栈仅包含一项(VC1实例);当您切换到VC2时,它将包含VC1和VC2的实例,只有当您实际切换到VC3时,才会创建实例并将其放入堆栈中

逐步浏览您的代码:

UINavigationController *project_NavigationController = 
                            (UINavigationController *) self.presentedViewController;
presentedViewController
属性与
modal
segues一起工作,其中您有一个prese
FileIO_ViewController *fileIO_ViewController = 
                    [[project_NavigationController viewControllers] objectAtIndex:1];