我正面临一种我不知道如何实施的情况。我的项目非常简单:
到目前为止它已实现,然后我需要实现的是当回到主ViewController(步骤1)时,我需要恢复在步骤3中选择的值,将值附加到URL并重新加载WebView零件。 我怎样才能做到这一点?我想知道这很简单但我找不到我的研究。
提前感谢您的帮助,非常欢迎。 亚历
答案 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控制器的viewWillDisappear
或tableView: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];