即时通讯即将构建,我希望有一个表格视图,您可以在其中选择一行,例如电子邮件地址。视图将推送到带有uitextField的简单页面,当您点击保存按钮时,它会将视图控制器弹回到初始页面,用户可以在该页面中选择下一个字段。
我遇到的问题是将文本文件中输入的信息传递回第一个视图控制器。这应该很简单,但我尝试的任何东西都不起作用
解决这个问题的最佳方法是什么。
感谢
答案 0 :(得分:4)
你可能正在考虑这个问题。在像Cocoa这样的MVC系统中,View Controllers的工作是管理视图,而不是数据。创建一个模型对象来保存您正在更新的数据。创建视图控制器时,将模型对象传递给它。它可以根据用户的更改来更新模型。它不应该担心谁叫它,或者它回归谁。它应该只更新模型对象,其他感兴趣的人应该读取模型对象。举个例子:
SettingsViewController
会有一个名为Settings
EmailViewController
等详细视图控制器时,您可以在显示之前将设置传递给它emailViewController.settings = self.settings
。self.settings.emailAddress = ...
这将您的视图逻辑与模型逻辑分开,模型逻辑是Cocoa模式的关键特性。如果你打这种模式,你会发现自己经常会想“从这里确实难以到达那里。”
答案 1 :(得分:2)
您可以使用委托方法,或者甚至更简单,只需在第一个视图控制器中定义一个实例变量NSString * textEntry即可设置(属性/合成),然后从堆栈中访问该视图控制器。
例如,在推送视图中,执行以下操作:
FirstViewController *firstViewController = [[[self navigationController] viewControllers] objectAtIndex:0];
[firstViewController setTextEntry:[textfield text]];
答案 2 :(得分:1)
我发现这样做的最简单方法是使用NSNotificationCenter。
在带有TableView的ViewController中:
- (void)updateRowValue:(NSNotification *)notification{
NSDictionary *valuesDictionary = [[NSDictionary alloc] initWithDictionary: [notification userInfo] copyItems:NO];
NSString *newString = [valuesDictionary objectForKey:@"StringVal"]
}
这是选择行时调用的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
TextFieldViewController *tfvc = [[TextFieldViewController alloc] init];
[tfvc setPostNotificationString:@"updateRowValue"];
[self.navigationController pushViewController:tfvc animated:YES];
}
现在在viewController中使用textField,当你按下按钮返回上一个viewController时调用:
- (IBAction)saveButtonPressed{
NSArray *valuesArray = [[NSArray alloc] initWithObjects:textField.text,nil];
NSArray *keyArray = [[NSArray alloc] initWithObjects:@"StringVal",nil];
NSDictionary *dictionary = [[[NSDictionary alloc] initWithObjects:valuesArray forKeys:keyArray] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:[self postNotificationString] object:self userInfo:dictionary];
[[self navigationController] popViewControllerAnimated:YES];
}