有两种方法可以去这里。这样做的标准模式是委托。你不需要单例。ViewControllerA
管理和列出您的数据。ViewControllerB
不需要了解所有这些数据的任何信息,因此没有理由通过单例等方式公开它。
ViewControllerB
在的头文件中创建委托协议。像这样的东西:
@protocol ViewControllerBDelegate
- (void)addContact:(NSString *)contact withBody:(NSString *)textBody;
@end
现在,指定ViewControllerA
将在其标头中实现委托协议:
@interface ViewControllerA : UIViewController <ViewControllerBDelegate>
不要忘记在' 标题ViewControllerB.h
的顶部导入。ViewControllerA
在ViewControllerA
的实现中,实现您在协议中指定的委托方法:
- (void)addContact:(NSString *)contact withBody:(NSString *)textBody {
[self.someArray addObject:[[SomeObject alloc] initWithContact:contact body:textBody]];
[self.tableView reloadData];
}
这显然只是一个例子——不确定你是如何管理你的数据结构的,最好将单元格插入到有意义的地方。
在 的标头中声明一个委托引用ViewControllerB
:
@property (weak, nonatomic) id<ViewControllerBDelegate> delegate;
当您出席时ViewControllerB
,设置ViewControllerA
为代表。
ViewControllerB *b = [[ViewControllerB alloc] init...];
b.delegate = self;
在由添加按钮触发的选择器中ViewControllerB
,在将视图控制器从导航堆栈中弹出之前回调委托:
[self.delegate addContact:contact withBody:text];
wherecontact
和text
是用户输入的值。
也可以使用块而不是委托,但原理是相同的——在您的情况下,让第二个视图控制器只负责接收输入,并将其传递回管理数据的视图控制器。