2013-03-02 1 views
0

У меня возникла ситуация, когда я не знаю, как ее реализовать. Мой проект очень прост, если у меня есть:Получить переменную между Segues

  1. ViewController, который представляет веб-просмотр с определенным URL-адресом;
  2. На том же контролере просмотра есть кнопка, которая переходит на другой viewController, реализованный segue;
  3. Второй VC уже загружен таблицей, поэтому, когда пользователь выбирает одну ячейку, я получаю значение и возвращаюсь обратно к основному viewController (шаг 1);

До сих пор это реализовано, то, что мне нужно реализовать, когда возвращаюсь к главному ViewController (шаг 1), мне нужно восстановить значение, выбранное на шаге 3, добавить значение к URL-адресу и перезагрузите компонент WebView. Как я могу это сделать? Интересно, что это просто, но я не мог найти в моих исследованиях.

Благодарим вас за помощь, очень приветствуем. Alex

+0

Какой тип segue вы используете? толчок или модальный? – Rakesh

+0

Я использую push – aburb

+0

На самом деле, это не имеет значения. Хитрость заключается в возможности доступа к переменной (значение, которое вы хотите передать) в первом контроллере представления. Один из способов сделать это объясняется в ответе. Другим является использование делегата приложений или глобально доступного объекта для хранения переменной. – Rakesh

ответ

-1

Поскольку вы отходите от Tableview по щелчку ячейки можно либо реализовать его в viewWillDisappear или tableView:didSelectRowAtIndexPath: (методе делегата) контроллер Tableview.

Вы можете объявить переменную с аксессорах в первом контроллере представления (скажем returnedValue типа NSString) затем в 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

Как я начинаю с объектива-c, я понял, что вы имели в виду, однако у меня все еще есть вопрос, где и как я должен объявить эту переменную в FirstViewController, например @property NSString * selectedCategoryVC; ??? Несмотря на то, что я не могу увидеть это свойство на secondVC. – aburb

+0

и еще один вопрос ... какой метод я должен реализовать на FirstViewController для получения возвращаемого значения и перезагрузки веб-представления? Большое вам спасибо за помощь. – aburb

+0

Я обновил ответ. Вы можете использовать любой метод, поскольку self.returnedValue заполняется. Например, если вы хотите загрузить веб-представление сразу, когда вернетесь к представлению, вы можете использовать 'viewDidAppear:'. Или вы можете использовать метод, который вы используете для загрузки веб-представления. Тебе решать. – Rakesh

0

У меня была такая же проблема ... проработаны тонны учебников и книг. Вот что сработало для меня. Он смешивает два метода, и, вероятно, требуется только один. Но, по крайней мере, я это понимаю и могу легко использовать. Методы делегирования и использования singleton для хранения вашей глобальной переменной.

Я вставлял свой код в Word, удалял материал, который не применялся, и оставил все, что вам нужно, я думаю.

Во-первых, вы создаете новый файл класса. Мой назывался OptionsSingleton. Это дает вам OptionsSingleton.h и OptionsSingleton.m. Шахта имеет больше переменных в ней, но вот то, что относится к вам:

OptionsSingleton.h

@interface OptionsSingleton : NSObject{ 
int gblRowPicked; 

} 

@property(nonatomic) int gblRowPicked; 

+(OptionsSingleton *) singleObj; 

@end 

OptionsSingleton.м

#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 был введен на раскадровке, нажав на Segue и назвав его в инспекторе свойств. Обработанный метод вызывается TableViewController при его закрытии. Все, что здесь сказано, это значение строки, чтобы доказать, что исходный контроллер представления знает строку. Ваш код возьмет его оттуда (вы можете передать данные в строке, если хотите ... вам нужно было бы объявить соответствующие глобальные переменные для этого.)

В файлах TableViewController есть такие вещи:

// TableViewController.h 


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

@interface TableViewController 

Протокол сообщает TableViewController, что метод «done» находится в исходном контроллере представления, а не сам 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