0

実装方法がわからない状況に直面しています。私のプロジェクトは非常に単純です。

  1. 特定のURLでWebビューを表示するViewController。
  2. 同じviewcontrollerには、segueによって実装された別のviewControllerに移動するボタンがあります。
  3. 2番目のVCにはすでにテーブルビューがロードされているため、ユーザーが1つのセルを選択すると、値を取得してメインのviewControllerに戻ります(ステップ1)。

これまでのところ実装されていますが、実装する必要があるのは、メインのViewController(step.1)に戻ったときに、step.3で選択した値を復元し、その値をURLに追加して、WebViewコンポーネントをリロードする必要があります。どうやってやるの?それは簡単なことだと思いますが、自分の研究では見つけることができませんでした。

よろしくお願いします。アレックス

4

2 に答える 2

0

私も同じ問題を抱えていました...たくさんのチュートリアルや本を読みました。これが私のために働いたものです。2つの方法が混在しており、おそらく1つだけが必要です。しかし、少なくとも私はそれを理解していて、簡単に使用できます。メソッドは委任であり、シングルトンを使用してグローバル変数を保持します。

コードを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);
   }

セグエ識別子は、セグエをクリックしてプロパティインスペクターで名前を付けることにより、ストーリーボードに入力されました。doneメソッドは、閉じるときにTableViewControllerによって呼び出されます。ここで言うのは、元のビューコントローラが行を認識していることを証明するための行の値だけです。コードはそこから取得します(必要に応じて、行のデータを渡すことができます...そのための適切なグローバル変数を宣言する必要があります)。

TableViewControllerファイルには次のものが含まれています。

//  TableViewController.h


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

@interface TableViewController

プロトコルは、「done」メソッドがTableViewController自体ではなく、元のViewControllerにあることを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

セルをクリックするとテーブルビューから戻るので、テーブルビューコントローラviewWillDisappearまたはtableView: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];
于 2013-03-02T16:06:59.937 に答える