iPhone - UINavigationController问题

时间:2010-08-28 14:17:47

标签: iphone objective-c uinavigationcontroller uitableview

我想在桌面上显示一些数据,我们称之为“TabeView”应用程序。

所以我在XCode上创建了一个“基于导航的”应用程序,它在“classes文件夹”中提供了4个文件。

  • RootViewController.h
  • RootViewController.m
  • TableViewAppDelegate.h
  • TableViewAppDelegate.m

现在,我想使用“didFinishLaunchingWithOptions”方法在TableViewAppDelegate中设置数据,我使用了一个数组。

然后,我需要将此数组“发送”到RootViewController。我在RootViewController中有一个数组变量,所以我假设我需要从TableViewAppDelegate“设置”RootViewController中的数组变量。我怎么能这样做?

我遇到的问题是,我不知道如何在TableViewAppDelegate中设置RootViewController中的数组变量。我想知道下面的内容是否可行

....
[RootViewController setMyArray:myArray];
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
....

但我不知道如何调用“RootViewController”。

希望我有道理。谢谢。

2 个答案:

答案 0 :(得分:0)

navigationController.myArray = myArray;

之前

[window addSubview:navigationController.view];

答案 1 :(得分:0)

首先,在RootViewController类中为数组变量创建一个属性。所以例如如果您的数组变量名为myArray,则代码可能如下所示:

在RootViewController.h中:

#import <UIKit/UIKit.h>

@interface RootViewController : UITableViewController {
    NSArray *myArray;
}

@property (nonatomic, retain) NSArray *myArray;

@end

并在RootViewController.m中添加相应的@synthesize行:

#import "RootViewController.h"

@implementation RootViewController

@synthesize myArray;

// methods here

@end

现在您可以像这样设置RootViewController对象的myArray成员:

myRootViewController.myArray = [NSArray arrayWithObjects:@"foo", @"bar", nil]; 

现在,在您的app委托类中,您可以使用self.navigationController的viewControllers属性来返回导航堆栈中的视图控制器。根控制器将始终位于索引0处.viewControllers将返回NSArray,其元素的类型为NSObject,因此您还需要强制转换为RootViewController指针。这里有两行,以使演员明确:

// get a pointer to the root view controller
id obj = [self.navigationController.viewControllers objectAtIndex:0];

// cast it to a RootViewController pointer
RootViewController* rvc = (RootViewController*)obj;

// Now you can set the array
rvc.myArray = someArray;

(为了在你的app委托类中使用RootViewController类名,你需要导入相关的头文件 - 把它放在TableViewAppDelegate.m的顶部:

#import "RootViewController.h"

就是这样!

P.S。请记住,将myArray属性声明为类型(非原子,保留)意味着您的RootViewController对象将最终指向您传递给它的相同的NSArray 实例。所以,例如:

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"foo", @"bar", nil];
myRootViewController.myArray = array;

[array removeAllObjects]; // myRootViewController.myArray is now empty!

您可以使用(非原子,复制),在这种情况下,您的RootViewController对象将复制您传入的数组并保留该数组。将数组分配给RootViewController对象后对数组的更改不会影响副本。