在Segues之间获取变量

时间:2013-03-02 14:40:16

标签: objective-c xcode webview tableview viewcontroller

我正面临一种我不知道如何实施的情况。我的项目非常简单:

  1. 一个ViewController,它使用特定的URL显示webview;
  2. 在同一个viewcontroller上有一个按钮,转到另一个由segue实现的viewController;
  3. 第二个VC已经加载了一个tableview,所以当用户选择一个单元格时,我得到该值并返回主viewController(步骤1);
  4. 到目前为止它已实现,然后我需要实现的是当回到主ViewController(步骤1)时,我需要恢复在步骤3中选择的值,将值附加到URL并重新加载WebView零件。 我怎样才能做到这一点?我想知道这很简单但我找不到我的研究。

    提前感谢您的帮助,非常欢迎。 亚历

2 个答案:

答案 0 :(得分: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并在属性检查器中将其命名,在故事板上输入了segue标识符。当关闭时,TableViewController将调用done方法。它在这里说的是行值,以证明原始视图控制器知道该行。您的代码将从那里获取。(如果您愿意,您可以传递行中的数据......您必须为此声明适当的全局变量。)

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

答案 1 :(得分:-1)

由于您在单击单元格时从tableview返回,您可以在tableview控制器的viewWillDisappeartableView:didSelectRowAtIndexPath:(委托方法)中实现它。

您可以在第一个视图控制器中声明带有访问器的变量(比如NSString类型的returnedValue) 然后在viewWillDisappear或tableView:didSelectRowAtIndexPath中:`你可以将变量传递给presentsViewController属性。

<强> 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];