从文本字段中获取字符串并将其传递给上一个viewController

时间:2011-02-28 16:10:34

标签: iphone objective-c ios4

即时通讯即将构建,我希望有一个表格视图,您可以在其中选择一行,例如电子邮件地址。视图将推送到带有uitextField的简单页面,当您点击保存按钮时,它会将视图控制器弹回到初始页面,用户可以在该页面中选择下一个字段。

我遇到的问题是将文本文件中输入的信息传递回第一个视图控制器。这应该很简单,但我尝试的任何东西都不起作用

解决这个问题的最佳方法是什么。

感谢

3 个答案:

答案 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];
}