将NSMutableArray传递给其他类会返回空数组

时间:2014-06-04 18:15:07

标签: ios objective-c arrays

我已经阅读了关于此的其他答案,起初我有一个(null)错误,但现在已经修复了。现在,每当我记录我在“SelectTeacherTableViewController.h”中创建并传递给SendMessageViewController类的NSMutableArray时,它就会创建一个数组,但它是空的。

以下是SelectTeacherTableViewController.h的代码

#import <UIKit/UIKit.h>

@interface SelectTeacherTableViewController :
UITableViewController
{
    NSMutableArray *recipients;
}

@property (strong, nonatomic) NSArray *teachers;
@property (strong, nonatomic) NSMutableArray *recipients;

@end

以下是我的SelectTeacherTableViewController中的代码,我在其中合成收件人并通过方法向他们添加对象。 (代码缩短)

#import "ParseStarterProjectAppDelegate.h"
#import "SelectTeacherTableViewController.h"
#import <Parse/Parse.h>

@interface SelectTeacherTableViewController ()

@end

@implementation SelectTeacherTableViewController
@synthesize recipients;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Message";
    self.recipients = [[NSMutableArray alloc] init];
    [PFUser logInWithUsername:@"awesome" password:@"password"];
    NSString *getCurrentUserSchoolKey = [[PFUser currentUser] objectForKey:@"schoolKey"];
    NSString *currentUserSchoolKey = [NSString stringWithFormat:@"%@", getCurrentUserSchoolKey];
    PFQuery *queryForTeachers = [PFUser query];
    [queryForTeachers orderByAscending: @"username"];
    [queryForTeachers whereKey: @"role" equalTo:@"Teacher"];
    [queryForTeachers whereKey:@"schoolKey" equalTo:currentUserSchoolKey];
    [queryForTeachers findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error) {
        NSLog(@"%@ %@", error, [error userInfo]);
    }
    else {
        self.teachers = objects;
        NSLog(currentUserSchoolKey);
        [self.tableView reloadData];
    }
}];

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    self.recipients = [[NSMutableArray alloc] init];
    [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    PFUser *user = [self.teachers objectAtIndex:indexPath.row];

if (cell.accessoryType == UITableViewCellAccessoryNone) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    [recipients addObject:user.objectId];
}
else {
    cell.accessoryType = UITableViewCellAccessoryNone;
    [recipients removeObject:user.objectId];
}

NSLog(@"%@", recipients);
}

当我在此处记录收件人时,它们确实包含所有正确的值。但是,这是我的SendMessageViewController,我从SelectTeacherTableViewController传递数组:

SendMessageViewController.m(代码缩短):

#import "SendMessageViewController.h"
#import <Parse/Parse.h>
#import <MobileCoreServices/UTCoreTypes.h>
#import "SelectTeacherTableViewController.h"

@interface SendMessageViewController ()
@end

@implementation SendMessageViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    SelectTeacherTableViewController *recipientList = [[SelectTeacherTableViewController alloc] init];
    NSMutableArray *recipients = [[NSMutableArray alloc] initWithArray:recipientList.recipients];
    NSLog(@"%@", recipientList);
}

在这里,当我记录收件人时,数组是空的。

我已经阅读了一些内容并遇到了一些解决方案,其中介绍了创建简单文件或使用AppDelegate存储全局变量的一些内容,但这些解决方案似乎都不适用于我。我有一种感觉,当我离开时,数据正在丢失。我的代码中有哪些地方出错了吗?我对Objective-C有点新意,这个问题一直困扰着我好几个小时。感谢。

如果您需要查看更多代码,请问我。感谢。

2 个答案:

答案 0 :(得分:0)

这:SelectTeacherTableViewController *recipientList = [[SelectTeacherTableViewController alloc] init];创建一个新对象。您添加到其他recipients内的SelectTeacherTableViewController数组中的任何内容都无关紧要。

如果您需要使用已添加到原始对象的信息,则必须传递对该对象的引用...而不是创建新对象。

答案 1 :(得分:0)

[[SelectTeacherTableViewController alloc] init]没有为您提供现有收件人列表的引用,它会创建一个新的收件人列表。在面向对象的编程中,您可以使同一个类的多个实例不是同一个对象。

Class!= Object