我一直试图解决这个问题,但没有提出解决方案。我有一个带有表格的视图控制器,表格的第一个单元格被分配给一个名为“添加朋友”的按钮。单击时,它会将您带到另一个视图控制器,其中包含表中的联系人列表。单击某个人时,它将返回到另一个视图控制器并添加所选人员。这是我到目前为止所做的。
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;
}
这让我可以添加一个朋友到目前为止,如果我决定将另一个添加到列表中,它将替换添加的第一个朋友。
答案 0 :(得分:0)
根据我的理解,每次在ContactsViewController中选择联系人时,都会实例化一个新的FirstViewController。相反,您应该引用原始的FirstViewController(可能在转换到ContactsViewController之前保存它),并使用此引用将联系人添加到原始数组[original.people addObject:userDict]
。只要你确保重新加载表,这应该可行。
答案 1 :(得分:0)
基本上发生的是每次选择新联系人时,您都在第一个视图控制器中重新创建阵列,因此它正在取代事物。理想情况下,您希望尝试避免使用类似故事板的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];
这应该做你以后的事情:)