2015-08-20 57 views
1

當我使用我的url方案啓動應用程序時,我正努力預填一個文本字段。當應用程序沒有在內存中啓動時,值沒有被設置(或者我認爲被viewDidLoad或類似的推翻了)。從UrlScheme設置ViewController的值

的歸結路上我考慮這個樣子的:

// AppDelegate.m 
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    UINavigationController *nav = (UINavigationController *)[[application keyWindow] rootViewController]; 

    MainViewController *main = (MainViewController *)[nav topViewController]; 

    [main setLabelText:@"this should be shown on screen"]; 

    return YES; 
} 

隨着ViewController坐在UINavigationController

// MainViewController.m 
@interface MainViewController() 

@property (weak, nonatomic) IBOutlet UILabel *someLabel; 

@end 

@implementation MainViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.someLabel.text = @"this is actually shown on screen"; 
} 

- (void)setLabelText:(NSString *)text 
{ 
    self.someLabel.text = text; 
} 

@end 

所以標籤顯示「這實際上是在屏幕上顯示」,而不是我在AppDelegate中設置的文字。在設置斷點時,我認爲這很明顯,因爲viewDidLoadsetLabelText之後被調用。

是否有一個更強大的路徑來預先填寫我缺少的自定義網址方案中的文本字段?

+0

當應用程序在後臺運行,則可以使用一個NSNotification,以讓你的ViewController知道,當你的應用程序使用自定義url方案打開。 – beeef

+0

「已經運行」的情況下,我的運輸應用程序正常工作(不是在簡單的秒殺項目,但不知道爲什麼)。這是造成麻煩的「新發布」。 – user1777136

回答

1

嘗試這種情況:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    UINavigationController *nav = (UINavigationController *)[[application keyWindow] rootViewController]; 

    MainViewController *main = (MainViewController *)[nav topViewController]; 
    main.view; 

    [main setLabelText:@"this should be shown on screen"]; 

    return YES; 
} 

的視圖是延遲加載所以它會加載第一次需要。

+0

我想你們都是對的,但這個伎倆。當你在手動啓動應用程序之後附加調試器時,請注意,當你在檢查是否可以使用url模式時需要做些什麼時,運行應用程序並不總是運行最新的代碼。這就是爲什麼我最初嘗試'main.view.hidden = NO;'因爲我在某些測試中做了SEEMED不工作,因爲模擬器運行的是舊代碼。 – user1777136

1

原因是在調用視圖控制器的viewDidLoad方法之前,應用程序委託調用setLabelText:。什麼你需要做的就是保持字符串的一個副本在視圖控制器上的屬性然後設置在標籤上的viewDidLoad

頁眉:

@interface MainViewController 

@property (nonatomic, copy) NSString *stringToSet; 

@end 

實現:

@implementation MainViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if (self.stringToSet) { 
     self.someLabel.text = self.stringToSet; 
    } else { 
     self.someLabel.text = @"Some default string"; 
    } 
} 

@end 

應用代表:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    UINavigationController *nav = (UINavigationController *)[[application keyWindow] rootViewController]; 

    MainViewController *main = (MainViewController *)[nav topViewController]; 

    [main setStringToSet:@"this should be shown on screen"]; 

    return YES; 
} 
相關問題