【问题标题】:iPhone - UINavigationController questioniPhone - UINavigationController 问题
【发布时间】:2023-03-09 14:26:02
【问题描述】:

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

所以我在 XCode 上创建了一个“基于导航”的应用程序,它在“类文件夹”中提供了 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”。

希望我说得有道理。谢谢。

【问题讨论】:

  • 为什么不在RootViewController中设置数组?
  • 我可以。但在开始之前,你能告诉我我想做的事情是否可行吗?如果没有,为什么不呢? :)
  • 不太确定 [google-app-engine] 标记是如何解决这个问题的。相应地重新标记。

标签: iphone objective-c uinavigationcontroller uitableview


【解决方案1】:

首先,在您的 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]; 

现在,在您的应用委托类中,您可以使用 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;

(为了在您的应用委托类中使用 RootViewController 类名,您需要导入相关的头文件 - 将其放在 TableViewAppDelegate.m 的顶部:

#import "RootViewController.h"

就是这样!

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

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

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

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

【讨论】:

    【解决方案2】:

    navigationController.myArray = myArray;

    之前

    [window addSubview:navigationController.view];

    【讨论】:

    • 这不起作用。我收到“对成员 myarray 的请求不是结构或联合。据我了解,我不是试图访问 NavigationController 中的变量,但我需要访问 RootViewController。它们是不同的对象吗?
    • 导航控制器应该有一个 rootViewController 的实例(你 initWithRootViewController:RootViewController 并且应该可以工作 - 我之前通过传递一个字符串来做到这一点......:/嗯。如果@simon whitaker的帖子没有'不工作,你能把你的整个应用程序委托给你吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多