编辑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的目标?
答案 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