根据调用视图控制器的类型,引用调用viewcontroller / Method

时间:2014-04-03 06:12:59

标签: ios objective-c cocoa-touch uiviewcontroller uikit

我有一个视图控制器,可以从其他几个视图控制器调用。此视图控制器包含一个UITextField,它根据视图控制器调用它来收集不同的信息。 收集后必须存储信息。为了尽可能独立,存储信息的方法应该位于调用视图控制器中。 因此,我在方法中使用以下代码来收集信息:

- (void) collectContent
{
    NSString *info = [textField text];
    [textField resignFirstResponder];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"NewValueA" object:info];

    [[self navigationController] popToRootViewControllerAnimated:YES];
}

在调用视图控制器中,我的init方法中有以下行:

- (id) init
{
    ...
    if (self)
    {
        ...
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storeNewValueA) name:"NewValueA" object:nil];
    }
return self;
}

但是现在,我想从另一个视图控制器使用这个视图控制器来收集ValueB或ValueC。如何引用调用视图控制器来调用存储收集值的方法?我想决定,如果从vcB调用视图控制器,输入的值必须是valueB,依此类推......

2 个答案:

答案 0 :(得分:0)

嗯,如果你想在应用程序关闭时保持这个简单的字符串,我会使用NSUserDefaults

存储字符串:

[[NSUserDefaults standardUserDefaults] setObject:@"MyValue" ForKey:@"USER_DEFAULTS_VIEWCONTROLLER_VALUES"];
[[NSUserDefaults standardUserDefaults] synchronize];

获取字符串:

[[NSUserDefaults standardUserDefaults] objectForKey:@"USER_DEFAULTS_VIEWCONTROLLER_VALUES"];

答案 1 :(得分:0)

您可以为此常用视图控制器创建协议,并通过调用视图控制器实现此协议:

@protocol TextFieldViewControllerDelegate : NSObject {
    - (void)contentCollected;
}

在文本字段(公共)视图控制器中定义委托属性:

@property (nonatomic, strong) id<TextFieldViewControllerDelegate> delegate;

调用视图控制器将自己设置为委托并实现所需的方法:

- (void) contentCollected:(NSString *)value
{
    // Store the value where needed
}

在公共(文本字段)视图中,控制器在需要时通知代理:

- (void) collectContent
{
    NSString *info = [textField text];
    [textField resignFirstResponder];

    [_delegate contentCollected:info];

    [[self navigationController] popToRootViewControllerAnimated:YES];

    _delegate = nil;
}

这样,您的公共视图控制器不需要知道哪个视图控制器调用它。使用委托将通知主叫视图控制器。