2013-03-02 26 views
0

我面臨的情況是我不知道如何實施。我的項目非常簡單,我擁有:在分段之間獲取變量

  1. 一個ViewController,呈現帶有特定URL的web視圖;
  2. 在同一個視圖控制器上有一個按鈕,轉到另一個由segue實現的viewController;
  3. 第二個VC有一個tableview已經加載,所以當用戶選擇一個單元格時,我得到該值並返回到主viewController(step.1);

到目前爲止,它的實現,那麼我需要實現回來的主視圖控制器(STEP.1)的時候,我需要恢復在STEP.3開始選擇的價值,附加價值的URL和重新加載WebView組件。 我該怎麼做?我不知道這很簡單,但我無法找到我的研究。

非常感謝您的幫助,非常歡迎。 Alex

+0

您使用的是什麼類型的segue?推或模態? – Rakesh 2013-03-02 15:57:47

+0

我正在使用推送 – aburb 2013-03-02 16:11:57

+0

其實,沒關係。訣竅是能夠訪問第一個視圖控制器中的變量(想要傳遞的值)。答案中解釋瞭解決此問題的一種方法。另一種方法是使用應用程序委託或全局可訪問的對象來存儲變量。 – Rakesh 2013-03-02 16:14:42

回答

-1

由於您單擊單元格時從tableview移回,您可以在tableview控制器的viewWillDisappeartableView:didSelectRowAtIndexPath:(委託方法)中實現它。

可以聲明與第一視圖控制器存取的變量(說類型的NSString的returnedValue) 然後在viewWillDisappear或的tableView:didSelectRowAtIndexPath方法:`可將變量傳遞給presentingViewController屬性。

FirstViewController.h

@interface FirstViewController: UIViewController{ 
    NSString *returnedValue; 
} 
@property (strong) NSString *returnedValue; 

FirstViewController.m

@implementation FirstViewController 
@synthesize returnedValue; 

SecondViewController.m

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    FirstViewController *firstVC = (FirstViewController *)[self presentingViewController]; 
    firstVC.returnedValue = @"The value you want to pass"; 
} 

然後在您的FirstViewController,在適當的方法可以實現:

NSURL *url = [NSURL urlWithString:@"%@",returnedValue"]; //according to your business logic 
[yourWebView loadURL:url]; 
+0

因爲我是Objective-C的初學者,所以我明白你的意思,但是我仍然有一個問題,我應該在FirstViewController上聲明這個變量,比如@property NSString * selectedCategoryVC; ??? 即使我不能在第二個VC上看到這個屬性。 – aburb 2013-03-02 20:18:31

+0

還有一個問題...我應該在FirstViewController上實現哪種方法來接收returnedValue並重新加載Web視圖?非常感謝您的幫助。 – aburb 2013-03-02 20:27:17

+0

我已經更新了答案。您可以使用任何方法作爲self.returnedValue填充。例如,如果您想在返回視圖時正確加載Web視圖,則可以使用'viewDidAppear:'。或者你可以使用你用來加載網頁視圖的方法。隨你便。 – Rakesh 2013-03-03 06:50:00

0

我有同樣的問題......通過噸教程和書籍的工作。這是爲我工作的。它混合了兩種方法,可能只需要一種。但至少我瞭解它並可以輕鬆使用它。這些方法是委派並使用單例來保存您的全局變量。

我將我的代碼粘貼到Word中,刪除了不適用的內容,並且留下了您需要的所有內容,我想。

首先,您創建一個新的類文件。我的稱爲OptionsSingleton。這給你OptionsSingleton.h和OptionsSingleton.m。 礦井中有更多的變數,但在這裏就是適用於您:

OptionsSingleton.h

@interface OptionsSingleton : NSObject{ 
int gblRowPicked; 

} 

@property(nonatomic) int gblRowPicked; 

+(OptionsSingleton *) singleObj; 

@end 

OptionsSingleton。m

#import "OptionsSingleton.h" 

@implementation OptionsSingleton 
{ 
    OptionsSingleton * anotherSingle; 
} 
@synthesize gblRowPicked; 

+(OptionsSingleton *)singleObj{ 

    static OptionsSingleton * single=nil; 

    @synchronized(self) 
    { 
     if(!single) 
     { 
      single = [[OptionsSingleton alloc] init]; 
     } 
    } 
    return single; 
} 

@end 

所有其他viewcontrollers可以看到gblRowPicked,如果你告訴他們關於單身人士的存在。

// ViewControllerThatCallsTheTableViewController.h 

#import <UIKit/UIKit.h> 
#import "OptionsSingleton.h" 

@interface ViewControllerThatCallsTheTableViewController.h : UIViewController 
{ 

    OptionsSingleton *optionsSingle; 
} 

和...

// ViewControllerThatCallsTheTableViewController.m 

#import "ViewControllerThatCallsTheTableViewController.h" 
#import "OptionsSingleton.h" 

@interface ViewControllerThatCallsTheTableViewController() 

@end 

@implementation ViewControllerThatCallsTheTableViewController 

- (void)viewDidLoad 
{ 

    optionsSingle = [OptionsSingleton singleObj]; 

    [super viewDidLoad]; 

} 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if([segue.identifier isEqualToString:@"PickFromTable"]){ 

     TableViewController *viewController = segue.destinationViewController; 
     viewController.delegate = self; 
    } 
} 
-(void)done{ 
    [self dismissViewControllerAnimated:YES completion: nil]; 

    NSLog (@"Back in ViewControllerThatCallsTableViewController, Row picked is %i",optionsSingle.gblGamePicked); 
    } 

的賽格瑞標識是通過點擊SEGUE,在屬性檢查器將其命名上的腳本輸入。完成的方法將在TableViewController關閉時調用。它在這裏表示的是行值,以證明原始視圖控制器知道該行。你的代碼會從那裏拿走它(如果你願意,你可以傳遞數據)...你必須爲此聲明合適的全局變量。)

TableViewController文件中包含這些東西:

// TableViewController.h 


@protocol ViewControllerThatCallsTheTableViewControllerDelegate <NSObject> 
-(void) done; 
@end 

@interface TableViewController 

該協議告訴TableViewController「完成」方法在原始視圖控制器中,而不是在TableViewController本身中。

// TableViewController.m 

#import "TableViewController.h" 
#import "BeginningCell.h" // used for the prototype cell 
#import "OptionsSingleton.h" 

@interface TableViewController() 

@end 

@implementation TableViewController 

- (void)viewDidLoad 
{ 

     optionsSingle = [OptionsSingleton singleObj]; 

    //other stuff: arrays for filling the table, etc. 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

optionsSingle.gblRowPicked=indexPath.row+1; 

    [self.delegate done]; 

} 

你走了......我希望我找到了適用於你的情況的工作程序中的所有代碼。對不起,如果我省略了什麼

-Rob