我有一个UINavigationController,我在其中加载不同的视图控制器。我想知道如何访问上一个视图的元素(例如标签等)。
这是一个例子。

查看A
myLabel.text = @“第一视图”;

(用户移至视图B)

查看B
(用户输入了一条消息,我需要在视图A中显示该消息)
类似于ViewA.myLabel.text = @“用户输入的消息”

我尝试了很多事情,但找不到任何有用的东西。请帮忙..

我正在使用没有ARC且没有情节提要的Xcode 4。

谢谢
山姆

编辑:

我想更新在View A的viewController中声明的属性,而不是直接更新标签。我的标签使用该属性更新。就像按下viewController一样,我们可以按如下所示传递值。

ViewA *myView = [[ViewA alloc] init];
myView.title = @"View B" ;
myView.tableView.tag = 3;
myView.myTextView.text = @"Some Text";
[self.navigationController pushViewController:myView animated:YES];
[myView release];

在弹出ViewB并返回ViewA时,是否有任何方法可以将这些值传递给ViewA的ViewController属性?

实际情况如下:用户获得并选择在textView中编写消息,或者他可以使用预定义的模板。如果他单击模板按钮,则将转到预定义模板列表,从中可以选择任何预定义消息。现在,我希望当用户单击任何预定义消息时,将弹出包含预定义消息列表的视图,并自动在主视图的textView中填充他选择的消息。实现此目标的最佳方法是什么?

TIA
山姆

最佳答案

您应该将AViewController设置为BViewController的委托,以便可以在特定事件后将其发送回消息。使用委托还可以使ViewController更好地解耦。

在您的BViewController中,定义如下协议:

BViewController.h:

@protocol BViewControllerDelegate <NSObject>
- (void)viewB:(UIViewController *)didEnterMessage:(NSString *)message;
@end

并添加一个委托属性:
@property (nonatomic, weak) id <BViewControllerDelegate> delegate;

当用户在您的BViewController中输入消息并单击弹出BViewController以显示给AViewController的按钮时,请执行以下操作:
- (IBAction)messageEntered {
  if ([self.delegate respondsToSelector:@selector(viewB:didEnterMessage:)]) {
    [self.delegate viewB:self didEnterMessage:self.yourTextField.text];
  }
}

您的AViewController应该实现BViewControllerDelegate协议,如下所示:

AViewController.h:
@interface AViewController <BViewControllerDelegate>

当您的AViewController创建BViewController时,在呈现它之前应将自己设置为其委托。可能看起来像这样:
BViewController *bvc = [[BViewController alloc] init…];
bvc.delegate = self;

最后,您的AViewController应该实现viewB:didEnterMessage:方法:
- (void)viewB:(UIViewController *)didEnterMessage:(NSString *)message {
  self.myLabel.text = message;
}

恕我直言,这是最干净的方法。

09-28 08:12