将对象从一个视图控制器添加到另一个视图控制器上的阵列

时间:2013-05-06 04:34:05

标签: iphone ios

我一直试图解决这个问题,但没有提出解决方案。我有一个带有表格的视图控制器,表格的第一个单元格被分配给一个名为“添加朋友”的按钮。单击时,它会将您带到另一个视图控制器,其中包含表中的联系人列表。单击某个人时,它将返回到另一个视图控制器并添加所选人员。这是我到目前为止所做的。

ContactsViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
FirstViewController *newVC = [self.storyboard instantiateViewControllerWithIdentifier:@"newVCSegue"];

newVC.peopleArray = [[NSMutableArray alloc] init];

Person *user = [contactsList objectAtIndex:indexPath.row];
NSArray *userKeys = [NSArray arrayWithObjects:@"FirstName", @"LastName", nil];
NSArray *userObjects = [NSArray arrayWithObjects:user.firstName, user.lastName, nil];
NSDictionary *userDictionary = [NSDictionary dictionaryWithObjects:userObjects forKeys:userKeys];
[newVC.peopleArray addObject:userDictionary];

[self.navigationController pushViewController:newVC animated:YES];

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

FirstViewController.h

@property (strong, nonatomic) NSMutableArray *peopleArray;

FirstViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//...
if (indexPath.row == 0) {
        contactName.text = @"Add Person";
        imgView.image = [UIImage imageNamed:@"plus-icon.png"];
} else {
NSString *firstName = [[peopleArray objectAtIndex:(indexPath.row)-1] objectForKey:@"firstName"];
NSString *lastName = [[peopleArray objectAtIndex:(indexPath.row)-1] objectForKey:@"lastName"];
contactName.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}
return cell;
}

这让我可以添加一个朋友到目前为止,如果我决定将另一个添加到列表中,它将替换添加的第一个朋友。

2 个答案:

答案 0 :(得分:0)

根据我的理解,每次在ContactsViewController中选择联系人时,都会实例化一个新的FirstViewController。相反,您应该引用原始的FirstViewController(可能在转换到ContactsViewController之前保存它),并使用此引用将联系人添加到原始数组[original.people addObject:userDict]。只要你确保重新加载表,这应该可行。

答案 1 :(得分:0)

基本上发生的是每次选择新联系人时,您都在第一个视图控制器中重新创建阵列,因此它正在取代事物。理想情况下,您希望尝试避免使用类似故事板的FirstViewController,这是非常糟糕的做法,可能会在以后导致各种问题。

我在这种情况下建议创建一个协议(查看委托模式)。这样,你拥有的是:

  • 使用点按"添加联系人"
  • 显示联系人列表,并将FirstViewController设置为委托
  • 用户点按联系人以添加
  • ContactsViewController通知所选用户的代表
  • FirstViewController添加用户,并关闭视图控制器

这通常是您采用的方法,而且实施起来非常简单。从协议开始

@protocol ContactsDelegate
-(void) contactsViewController:(ContactsViewController *)vc didSelectContact:(Person *)person;
@end

然后,让您的FirstViewController实现此协议。为此,请在头文件中,在名称后面的尖括号中添加ContactsDelegate

在FirstViewController的实现中,添加contacts delegate的新方法。

在您的ContactsViewController.h文件中,添加

@property (nonatomic, assign) NSObject<ContactsDelegate> *delegate;

然后,当您显示联系人视图控制器时,请设置代理

userVc.delegate = self;
[self presentModalViewController:userVc];

然后,在用户视图控制器didSelectRowAtIndexPath:中,只需告知代表您已选择该人

[delegate contactsViewController:self didSelectContact:[contactsList objectAtIndex:indexPath.row]];

最后,在你的FirstViewController中,在你添加的委托方法中,我们需要将用户添加到列表中,而不是重新创建列表

[peopleArray addObject:person];

这应该做你以后的事情:)