Iphone 在AppDelegate的第二个选项卡中将NSMutableArray添加到TableView

Iphone 在AppDelegate的第二个选项卡中将NSMutableArray添加到TableView,iphone,ios,objective-c,xcode,ios6,Iphone,Ios,Objective C,Xcode,Ios6,在以下教程之后,我没有遇到任何问题:。本质上,本教程教您创建一个简单的表视图,其中填充了来自NSMutableArray的数据,并随后深入到每个项的DetailView 然后,我尝试通过创建一个TabViewController并将创建的表视图作为该控制器的“Tab item 2”来增强我的功能 这打破了表的自动填充 用于从AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWi

在以下教程之后,我没有遇到任何问题:。本质上,本教程教您创建一个简单的表视图,其中填充了来自NSMutableArray的数据,并随后深入到每个项的DetailView

然后,我尝试通过创建一个TabViewController并将创建的表视图作为该控制器的“Tab item 2”来增强我的功能

这打破了表的自动填充

用于从AppDelegate.m

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    Person *person1 = [[Person  alloc] initWithName:@"Monica"
                                            balance:420
                                         thumbImage:[UIImage imageNamed:@"01.jpg"]
                                          fullImage:[UIImage imageNamed:@"01_t.jpg"]];
    Person *person2 = [[Person  alloc] initWithName:@"Ross"
                                            balance:630
                                         thumbImage:[UIImage imageNamed:@"02.jpg"]
                                          fullImage:[UIImage imageNamed:@"02_t.jpg"]];
    Person *person3 = [[Person  alloc] initWithName:@"Rachel"
                                            balance:420
                                         thumbImage:[UIImage imageNamed:@"03.jpg"]
                                          fullImage:[UIImage imageNamed:@"03_t.jpg"]];

    NSMutableArray *persons = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *initialViewController = (UIViewController *)[storyboard instantiateViewControllerWithIdentifier:@"RootViewController"];
    self.window.rootViewController = initialViewController;
    TableViewController * peopleTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"PersonTableViewController"];
    [peopleTableViewController setPersons: persons];

    // Override point for customization after application launch.
    return YES;
}
“persons”是一个Person实例数组,它是TableViewController的属性。以下是基于TableViewController.m中的“persons”数组的表填充:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"PersonCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    //For each person
    Person *person = [self.persons objectAtIndex:indexPath.row];
        cell.textLabel.text = person.name;
        cell.imageView.image = person.thumbImage;
        cell.detailTextLabel.text = [person getPrice];

    return cell;
}
最后,故事板位于此处:

再重复一次,这一切编译得很好,但在测试期间,打开选项卡项#2(根据情节提要,表视图控制器存在的地方)时,表是空的。在我添加选项卡之前,这是有效的


我对目标C还很陌生,所以如果您需要其他信息,请告诉我。

我想您的问题在于:

 Person *person = [self.persons objectAtIndex:indexPath.row];

尝试将代码放入
ViewDidLoad
而不是
AppDelegate
并运行它。(仅用于测试)

您的问题是,您正在实例化新的视图控制器,而不是使用故事板中已有的视图控制器。当此应用程序启动时,选项卡栏控制器及其内容视图控制器都将实例化。此外,由于选项卡2中的一个控制器是导航控制器,因此其根视图控制器TableViewController也将被实例化。因此,您只需要获取对此表视图控制器的引用,而不是创建新的引用:

    UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
    UINavigationController *nav = tabVC.viewControllers[1];
    TableViewController *peopleTableViewController = nav.topViewController;
    [peopleTableViewController setPersons:persons];

这应该是可行的,但我认为最好将Person对象和persons数组的创建移动到table view控制器的viewDidLoad方法。

请注意,TableViewController[viewDidLoad]上的“persons”为NULL,但当我在appDelegate[didFinishLaunchingWithOptions]的底部进行检查时设置正确不确定这一点,因为我通常不使用
-instanceeviewcontrollerwhidentifier
,但在您在控制器上设置
人员
ivar之前,可能会调用tableViewController的
-viewDidLoad
(即在
-instancee…
),这将解释
空值的原因。您可以尝试在
中执行
[tableView reloadData]
-视图将出现:
,看看这是否有帮助。非常感谢!现在可以了!我对Objective C非常陌生,自从3-4年前开始做C一段时间以来,我就没有玩弄过指针,所以试图弄清楚我是在指向地址还是在创建新的实例有点让人不知所措!主要的变化似乎是.viewControllers[1]——我想沿着这条路走下去,但不确定它是否通过直接引用数组中的项#1打破了最佳实践。谢谢你的确认!感谢您的回复,是的,我同意我通过让AppDelegate创建阵列打破了最佳做法。我将确保在正确的类中保留任何类似的元素。有了C、Java和PHP的背景,我仍在学习这门复杂的语言。如果您知道任何涵盖最佳实践的材料,它将非常方便!在本主题中,为创建的每个视图控制器创建自定义类是常规做法吗?我尝试过谷歌搜索,检查得非常彻底,但似乎没有一个简明的是或否。我有一本关于这方面的好书:
iPhone应用程序开发-用Nick Kuh的ios 6 SDK在5天内构建一个应用程序
,是的,我认为为每个视图控制器创建一个类是一种普遍的做法,但有时这取决于你会怎么做。检查我告诉你的那本书。