1

编辑 1

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

在当前的情节提要中,我将文本字段和占位符文本留空,因为下面的方法似乎充分提供了示例链接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并不是我所需要的。

此外,从我的试验看来,Michael Dautermann 建议的解决方案建议将我的初始化文本放入 XibviewDidLoad或 Storyboard 中或中,这不起作用,因为文本在返回 VC 时总是返回到其初始值(可能是因为viewDidLoad方法被触发),所以我认为我确实需要在我的 AppDelegate.m 中创建一个 ivar,正如我在原始问题中所问的那样,而不是在我的 ViewController.mviewDidLoad中,以获得所需的结果,显然。也许在 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 的目标?

4

5 回答 5

2

将那个“ urlNameInput.text =”位放入您的视图控制器的“ viewDidLoad”方法中,而不是“ didFinishLaunchingWithOptions:”方法(您的视图控制器可能还没有被实例化。

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

于 2013-08-15T22:41:49.660 回答
1

好的,我很难理解您要做什么,但是在您的应用程序委托上创建一个 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”

于 2013-08-16T14:53:30.347 回答
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

然后,在视图中会出现...

-(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"];
于 2013-08-16T18:18:52.870 回答
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

故事板

于 2013-08-17T17:35:23.407 回答
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
}

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

于 2013-08-15T22:41:48.730 回答