ivar for appdelegate.m中的视图控制器

时间:2013-08-15 22:37:25

标签: ios initialization storyboard

编辑1

在我尝试使用codeInOrange到目前为止的答案之后,我添加了一些代码来指示其状态,到目前为止我的代码表现得像我的代码最初的行为,即示例链接首先显示在文本中字段并且可以由用户更改,但是当用户返回VC时,任何新的链接文本都已被原始样本链接替换。我发布这些额外代码的原因是试图重新连接codeInOrange有希望的答案,因为我误解了他原来的建议和后来的评论的逻辑流程。

在当前的Storyboard中,我将文本字段和占位符文本留空,因为下面的viewDidLoad方法似乎充分提供了示例链接。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.urlNameInput.text = @"sample http";
    // Do any additional setup after loading the view, typically from a nib.
    self.urlNameInput.clearButtonMode = UITextFieldViewModeAlways;
    self.urlNameInput.clearsOnBeginEditing = NO;   
}


- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    if (textField == self.urlNameInput) {
        [textField resignFirstResponder];
        [self processPbn];
    }
    return YES;
}


- (void)viewDidAppear:(BOOL)animated
{
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

    // self.urlNameInput.text = appDelegate.stringForTextField;
    appDelegate.stringForTextField = self.urlNameInput.text;
}

- (void) processPbn
{
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:self.urlNameInput.text] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

    [NSURLConnection sendAsynchronousRequest:theRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *connection, NSData *data, NSError *error)
     {
         // lots of detail code has been elided in this method 
         self.iboard = 0;
         NSRegularExpression *regex = [NSRegularExpression  regularExpressionWithPattern:toMatch options:NSRegularExpressionDotMatchesLineSeparators error:&error];
         for (NSTextCheckingResult* board in [regex matchesInString:string options:NSRegularExpressionDotMatchesLineSeparators range:NSMakeRange(0, [string length])])
         {

         if (self.iboard>0) {
             AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

             appDelegate.stringForTextField = self.urlNameInput.text;
         }
     }];
}

编辑1

编辑0

我不想在应用程序关闭和启动之间保留文本,因此使用NSUserDefaults的答案并不是我需要的。

此外,从我的试验中可以看出,迈克尔·道特曼建议的解决方案建议将我的初始化文本放在viewDidLoad或者Xib或Storyboard中,这不起作用,因为文本总是返回其初始值返回VC(可能是因为触发了viewDidLoad方法),所以我认为需要在我的AppDelegate.m 中创建一个ivar,正如我在原始问题中所提出的那样,而不是在我的ViewController.m viewDidLoad中,显然可以获得所需的结果。也许在AppDelegate.m中创建B00L ivar会更容易,这是一个告诉原始文本或当前文本是否需要的标志。但我无法弄清楚如何做到这一点。所以,请在答案中考虑这个编辑。

编辑0

我的AppDelegate.m包含以下代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        BDViewController *vc = [sb instantiateInitialViewController];
        self.viewController = (id)vc;
    }
    self.window.rootViewController = self.viewController;

    [self.window makeKeyAndVisible];

    return YES;
}

在VC中我希望​​在启动时设置一个ivar,一个NSString,以便它可以作为我的UITextField中的示例文本。稍后,当用户将有效文本提供给UITextField时,我希望将UITextField调整为新值。

目前在我的VC.h中,声明了文本字段,并在VC.m中合成如下。

@property (nonatomic, strong)  UITextField *urlNameInput;


@synthesize urlNameInput;

我尝试将以下代码放入didFinishLaunchingWithOptions:,但在运行应用时看不到所需的文字。

    self.viewController.urlNameInput.text = @"example http";

如何以编程方式完成初始化UITextField的目标?

5 个答案:

答案 0 :(得分:2)

将“urlNameInput.text =”位放入视图控制器的“viewDidLoad”方法中,而不是“didFinishLaunchingWithOptions:”方法(视图控制器可能尚未实例化。)

甚至比这更好,只需在故事板或XIB文件中设置初始文本,然后就可以稍后以编程方式对其进行调整。

答案 1 :(得分:1)

好的我很难理解你要做什么,但是在你的app委托上创建一个NSString iVar(尽管还有很多其他的解决方案)将允许你将文本字段文本设置为你想要的任何内容VC回到屏幕上。

AppDelegate.h

@property (strong, nonatomic) NSString *stringForTextField;

这样,您可以在加载视图时初始化文本字段文本(viewDidLoad)

self.urlNameInput.text = @"example http";

然后每当需要更改该文本值时(例如在另一个视图控制器中的textFieldShouldReturn中。我假设您有另一个基于您的问题的文本字段)

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

appDelegate.stringForTextField = textField.text;

并在VC中的viewDidAppear中使用textField设置该值。

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

self.urlNameInput.text = appDelegate.stringForTextField;

可能不是最好的方法,但它会起作用。

修改

在viewDidAppear中确定:

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

if ([appDelegate.stringForTextField isEqualToString:@""]){

    self.urlNameInput.text = @"example http";

} else {

    self.urlNameInput.text = appDelegate.stringForTextField; 

}

现在这样做的是,如果用户转到另一个视图控制器并返回,则文本字段文本将是用户上次输入的内容,除非在另一个视图控制器中,stringForTextField更新为某个新值。如果这仍然不起作用,请查看您的processPbn方法以确保输入if子句并设置该值。否则它将始终说“example http”

答案 2 :(得分:0)

这是NSUserDefaults的完美用法。当用户输入内容时,只需将其存储在NSUserDefaults中。检查每次启动时NSUserDefaults条目是否为空,如果是,则只显示原始字符串。

使用以下内容保存NSUserDefaults中的文本:

[[NSUserDefaults standardUserDefaults]setObject:@"yourNewString" forKey:@"userTextEntered"];

然后在每次发布时检查一下:

if([[NSUserDefaults standardUserDefaults] objectForKey:@"userTextEntered"])
{
    //display the user entered string
}
else
{
    //display the string that you want to display prior to text being entered
}

但是,只有在在应用程序关闭和启动之间保留文本时才需要此解决方案。

答案 3 :(得分:0)

我不明白为什么在应用程序启动过程中坚持以前的价值并不重要,特别是当用户只在应用程序生命周期中保持它时,它是有益的。 codeInOrange的答案通过向AppDelegate添加属性来实现。我唯一要补充的是条件if()。如果要在没有任何属性的情况下执行此操作,仍可以使用NSUserDefaults。

在ViewController.m文件的顶部

#define SetHTTPString(string) [[NSUserDefaults standardUserDefaults]setObject:string forKey:@"HTTPString"] //no semicolon
#define GetHTTPString() [[NSUserDefaults standardUserDefaults]objectForKey:@"HTTPString"] //no semicolon

然后,在viewWillAppear ......

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSString *httpString = GetHTTPString();
    if (httpString) {
        self.urlNameInput.text = httpString;
    } else {
        self.urlNameInput.text = @"Example http";
    }
}

接下来,在用户输入文本并“输入”

的方法中
...methodToEnterURL {
    SetHTTPString(self.urlNameInput.text);
}

最后,如果您绝对想要销毁NSUserDefaults中的值,请将此方法添加到AppDelegate的didEnterBackground方法中:

[[NSUserDefaults standardUserDefaults]setObject:@"Example http" forKey:@"HTTPString"];

答案 4 :(得分:0)

下面的代码假设故事板包含初始的默认文本(至少3个字符长度)。

我非常感谢我从其他人那里获得的帮助,尤其是来自 codeInOrange 的帮助。我实际上相信这是codeInOrange的解决方案,但是在我最终偶然发现这个问题之前,我从未能完全放下他的作品。

我希望这真的是一个有效的答案,如果我没有清楚地陈述我的问题,或者我误解了其他人的有效答案,特别是codeInOrange,我向所有人道歉。

//
//  ViewController.m
//  StickyPlaceholder
//
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize textInput;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    if (!appDelegate.stringForTextField)appDelegate.stringForTextField = self.textInput.text ;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    if (textField == self.textInput) {
        [textField resignFirstResponder];
// next line is dummy processing            
        if (self.textInput.text.length>2)appDelegate.stringForTextField = self.textInput.text;

    }
    return YES;
}

- (void)viewDidAppear:(BOOL)animated
{
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    self.textInput.text = appDelegate.stringForTextField;
}

@end

Storyboard