1

編集 1

codeInOrangeこれまでのところ、私のコードが最初に動作したように動作します。つまり、サンプル リンクが最初にテキスト フィールドに表示され、ユーザーが変更できます。、ただし、ユーザーが 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は必要なものではありません。

viewDidLoadまた、私の試行から、私の初期化テキストをXib または Storyboard のいずれかに配置することを提案する Michael Dautermann によって提案された解決策が機能しないように見えます。メソッドがトリガーされます)、したがって、目的の結果を得るには、ViewController.mではなく、元の質問で尋ねたように、AppDelegate.m に ivar を作成する必要があるviewDidLoadと思います。おそらく、元のテキストまたは現在のテキストが必要かどうかを示すフラグである B00L ivar を AppDelegate.m に作成する方が簡単でしょう。しかし、それを行う方法もわかりません。したがって、回答でこの編集を検討してください。viewDidLoad

編集 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 では、NSString である ivar を起動時に設定して、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

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;

おそらく最善の方法ではありませんが、うまくいくでしょう。

編集

ビューでOKDidAppear:

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

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

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

} else {

    self.urlNameInput.text = appDelegate.stringForTextField; 

}

ユーザーが別のView Controllerに移動して戻ってきた場合、別のView Controllerで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 に答える