如何在parentViewController中从childViewController更改UITextField和UISwitch的值

时间:2014-05-22 22:52:58

标签: ios objective-c uitableview childviewcontroller

我发现了很多如何使用chlidViewController的方法。但我找不到如何从childViewController更改和设置uitextfield和uiswitch的值。

ChildViewController.h:

@protocol VVInformationTableViewControllerDelegate;

@interface VVInformationTableViewController : UITableViewController

@property (weak, nonatomic) id<VVInformationTableViewControllerDelegate> delegate;

@property (weak, nonatomic) IBOutlet UITextField *nameTextField;

@property (weak, nonatomic) IBOutlet UITextField *surnameTextField;

@property (weak, nonatomic) IBOutlet UITextField *emailTextField;

@property (weak, nonatomic) IBOutlet UITextField *locationTextField;

@property (weak, nonatomic) IBOutlet UITextField *headlineTextField;

@property (weak, nonatomic) IBOutlet UITextField *positionTextField;

@property (weak, nonatomic) IBOutlet UITextField *companyTextField;

@property (weak, nonatomic) IBOutlet UISwitch *messagesEnable;

@end

ParentViewControler.m:

   - (void)viewDidLoad
{
    self.currentAttendee = [VVAPIClient sharedClient].currentUser;

    NSParameterAssert(self.currentAttendee);

    [super viewDidLoad];
    [self.navigationController setNavigationBarHidden:YES];

    self.infoTableController = [[VVInformationTableViewController alloc] initWithNibName:@"InformationTableViewController" bundle:nil];
    [self addChildViewController:self.infoTableController];

}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.infoTableController.nameTextField.text = self.currentAttendee.firstName?:@"";
    self.infoTableController.surnameTextField.text = self.currentAttendee.lastName?:@"";
    self.infoTableController.emailTextField.text = self.currentAttendee.email?:@"";
    self.infoTableController.locationTextField.text = self.currentAttendee.location?:@"";

    self.infoTableController.headlineTextField.text = self.currentAttendee.headline?:@"";
    self.infoTableController.positionTextField.text = self.currentAttendee.position?:@"";
    self.infoTableController.companyTextField.text = self.currentAttendee.company?:@"";

}

-(void)viewDidLayoutSubviews{

    self.infoTableController.messagesEnable.on = NO;
    self.infoTableController.nameTextField.tag = 0;
    self.infoTableController.surnameTextField.tag = 1;
    self.infoTableController.emailTextField.tag = 2;
    self.infoTableController.locationTextField.tag = 3;

    self.infoTableController.headlineTextField.tag = 5;
    self.infoTableController.positionTextField.tag = 6;
    self.infoTableController.companyTextField.tag = 7;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

大卫在评论中说,不要。

它违反了其他视图控制器的封装,并导致了意大利面条代码。

您应该将另一个VC(View Controller的)视图视为私有。

您应该做的是向子视图控制器添加属性以保存您需要显示的字符串和其他状态数据。然后在子视图控制器的viewWillAppear方法中,您可以获取设置并将它们应用于视图层次结构。

在你的情况下,因为你正在做的是显示关于“currentAttendee”的一大堆信息,(我猜这是一个模型对象)你可能想要考虑将一个指向整个参与者对象的指针传递给孩子,让它显示信息本身。

或者,孩子可以编辑对象,您可能想要传递副本,并在想要提交在子项中进行的更改时使用委托方法,或者只是在您想要放弃更改时返回。