0

我面临着我不知道如何实施的情况。我的项目非常简单,我有:

  1. 一个 ViewController,它显示一个带有特定 URL 的 webview;
  2. 在同一个视图控制器上,有一个按钮可以转到另一个由 segue 实现的视图控制器;
  3. 第二个 VC 已经加载了一个 tableview,所以当用户选择一个单元格时,我得到值并返回到主 viewController (step.1);

到目前为止它已经实现,那么我需要实现的是当回到主 ViewController(step.1)时,我需要恢复在 step.3 中选择的值,将值附加到 URL 并重新加载 WebView 组件。我怎样才能做到这一点?我想知道这很简单,但我在研究中找不到。

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

4

2 回答 2

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

如果您告诉他们单例的存在,所有其他视图控制器都可以看到 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 “完成”方法在原始视图控制器中,而不是在 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];

}

你去...我希望我在我的工作程序中找到了适用于你情况的所有代码。对不起,如果我遗漏了什么。

-抢

于 2013-03-03T13:57:28.670 回答
-1

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

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

第一视图控制器.h

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

第一视图控制器.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];
于 2013-03-02T16:06:59.937 回答