9

私はiOSアプリを開発していますが、今は途方に暮れています。最初のView ControllerからTabBarViewControllerの最初のタブに(ストーリーボードを使用して)データを渡そうとしています。ビューコントローラー間でデータを渡す方法を説明するチュートリアルをたくさん見つけましたが、私のタブバーでは何も機能しませんでした。タブ バー コントローラーには一種のビューの配列が含まれていることはわかっています。View Controller と Tab Bar Controller の関係は、セグエ (プッシュ) を使用して実現されます。だから、prepareForSegue() メソッドを使うのは簡単だと思いました。そのように:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
 if ([[segue identifier] isEqualToString:@"tab"]) {

 // ...

    } 
 }  

残念ながら、タブ バー コントローラーと各タブ バー ビューの間の関係は、本当のセグエではありません。あくまで「関係」です。つまり、上記の方法に使用できるセグエ識別子はありません。この場合、prepareForSegue を使用する可能性はありますか? そうでない場合、この問題を解決する方法はありますか? 同様の質問があることは知っていますが、答えはそれほど役に立ちませんでした。タブ バー コントローラー内のタブ (ビュー) ごとに新しいファイルを作成する必要がありますか? または、objectAtIndex() で複数のビューにアクセスして、タブ バー コントローラー全体に対して 1 つのクラス (m. & h.) を持つことは可能ですか?

前もって感謝します!

4

6 に答える 6

8

これが機能した私のセットアップです:

  1. セグエのセットアップ:
    1. ストーリーボードに2つの子View Controllerを持つTab Bar Controllerへのセグエを使用してView Controllerをセットアップします
    2. セグエ識別子を指定 ( tab)
  2. ストーリーボードのセットアップ クラス:
    1. ビュー コントローラ クラス =ViewController
    2. タブ バー コントローラ クラス =TabBarController
    3. Tab Bar Controller Child View Controller クラス = TabsViewController(両方で共有)
  3. labelStringタブ バー コントローラーの設定プロパティ:

    1. TabBarController.h

      @property (nonatomic, strong) NSString *labelString;
      
    2. TabBarController.m

      @synthesize labelString;
      
  4. での設定prepareForSegue方法ViewController.m:

    #import "TabBarController.h"
    
    ...
    
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
        if ([[segue identifier] isEqualToString:@"tab"]){
            TabBarController *tabBar = [segue destinationViewController];
            [tabBar setLabelString:[NSString stringWithFormat:@"This has been set"]];
        }
    }
    
  5. UILabel子タブ バー ビュー コントローラーの s をセットアップします。

    1. UILabelデフォルトコントロールを両方の子 View Controller にドラッグします
    2. でプロパティを作成TabsViewController.h:

      @property (nonatomic, strong) IBOutlet UILabel *label;
      
    3. 5.1ストーリーボードにフック5.2アップ

  6. での設定ViewDidLoad方法TabsViewController.m:

    #import "TabBarController.h"
    
    ...
    
    @synthesize label;
    
    ...
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        TabBarController *tabBar = (TabBarController *)self.tabBarController;
        label.text = [NSString stringWithFormat:@"Tab %i: %@",[tabBar.viewControllers indexOfObject:self],tabBar.labelString];
    }
    

1 番目と 2 番目のタブをクリックするTab 0: This has been setTab 1: This has been set、それぞれ と というラベルが表示されます。

于 2013-07-19T12:53:20.117 に答える
8

階層が Viewcontroller->UItabbarcontroller->ViewCONtroller の場合

私の場合、データを marketviewcontroller に送信する必要があります。tabcontroller では、marketviewcontroller はインデックス 0 に存在します。

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
 if ([[segue identifier] isEqualToString:@"tab"])
  {
    UITabBarController *tabar=segue.destinationViewController;
    MarketViewController *marketViewcontroller=[tabar.viewControllers objectAtIndex:0];

   // pass data to market view controller
    [marketViewcontroller passobject:Yourdata];
 //   or 
  marketViewcontroller.value=Yourdata
  } 
  }  

in MarketViewController.h 
 @property(nonatomic,retain) NSString * value;
于 2013-07-19T09:57:44.620 に答える
1

UIViewController から TabBarViewController をどのように表示していますか?

私はセグエで推測しています。これがあなたのやり方である場合、タブ内のすべてのコントローラーの「親」であるこの UITabBarController にデータを渡すことができます。

文字列を UITabBarController に渡したいとします。このコントローラーでプロパティを定義し、セグエの前に設定します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
      if ([[segue identifier] isEqualToString:@"tab"])
      {
          UITabBarController *tabBarVC=segue.destinationViewController;
          tabBarVC.stringToSet = @"hi";
      }
  }

次に、デリゲート メソッドを使用して、ビュー コントローラーを選択したので、親プロパティを子に渡すことができます。

- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
    viewController.stringToSet = self.stringToSet // self is UITabBarController
}
于 2013-07-19T10:29:49.843 に答える
0

初めにすること:

1-何らかの理由でデータをタブに渡したい...

また:

2-データをタブに渡したいので、別のタブに渡すことができますUIViewControllerか?

2 番目のオプションの場合、その最も一般的なパターンはシングルトンです。アプリケーションのさまざまな部分で使用/再利用できる共通データを保持できる場所。

于 2013-07-19T09:53:55.610 に答える
0

最も簡単な方法は、カスタム クラスを作成し、コントローラからカスタム クラスに値を設定してから、カスタム クラスからコントローラに値を取得することです。

サンプルコードは次のとおりです。

たとえば、最初にカスタムクラスを作成します

AppUtility.h

+(void)setXxxName:(NSString *)str;
+(NSString *)getXxxName;

AppUtility.m

static NSString *xxxname;

+(void)setXxxName:(NSString *)str{

   xxxname=str;
 }

+(NSString *)getXxxName{

  return xxxname;
 } 

FirstController.m

コントローラーにカスタム クラスをインポートする

#import "AppUtility.h"

最初のコントローラーからカスタム クラスに値を設定するには、以下のコードを使用して値を設定します。

[AppUtility setXxxName:@"xyz"];

2 番目の controller.m

コントローラーにカスタム クラスをインポートする

#import "AppUtility.h"

ここでは、カスタム クラスから値を取得します。以下のコードを使用して値を取得します。

NSString *str = [AppUtility getXxxName];

appUtility クラスで nslog ステートメントを使用して、値が正しいかどうかを確認します

于 2013-11-19T06:30:53.867 に答える