0

私は作成中のアプリケーションを持っていますが、これが私が何時間もかけて考え出した問題です。私はタブベースのアプリを持っています。最初のタブには UILabel オブジェクトがあり、メソッドを持つ SecondViewController.m から NSString を表示する必要があります。

-(IBAction) save: (id) sender{

   // This String holds data from the secondViewController's textfield to be passed to the 
   // UILabel whch is on the firsViewController.m

   NSString *data = self.addDataTextfield.text;
 }

シングルトンを含む多くの方法を使用しましたが、シングルトンは親から子にデータを渡すことを意図しており、この場合、子は親コントローラーにデータを送信できないことをどこかで読んだので、それらは機能しませんが、唯一の方法はプロトコルを使用することですしかし、私はこの方法を使用してちょっと迷っています。これが私のsecondViewController.hにあるものです

#import <UIKit/UIKit.h>
#import "singletonObj.h"
#import "AppDelegate.h"

// Using a Protocol to pass data Back to the parent view
@protocol passStringDelegate <NSObject>

-(void) enteredString: (NSString *)string;

 @end

 @interface SecondViewController : UIViewController <UITextFieldDelegate>
   {
     singletonObj *object; // This singleton isnt being used, Just there incase

    }


    @property (strong, nonatomic)IBOutlet UITextField*addDataTextField;



    - (IBAction)Save:(id)sender;

    @property (retain) id <passStringDelegate> delegate;

    @end

私の質問は、@protocolを使用してこれを実行し、このsecondViewControllerからデータを渡す方法はありますか、または少なくともこのコード内でNSNotificationCenterを使用してデータを渡す方法を誰かに教えてもらえますか? AppDelegateクラスを使用してデータを渡すのは快適ではありません.Appleのやり方に反するか、私にとってはうまくいかないprepareforSegueのようです。

私は周りを探していましたが、ほとんどの場合、親から子に送信されているデータを見つけましたが、ChildViewController が NSString を ParentViewController に送信してそのデータを UILAbel に表示できるタブベースの例は見当たりません。

4

2 に答える 2

0

これを行うにはいくつかの方法があります。タブ バー コントローラーのコンテンツ コントローラーのいずれかから、self.tabBarController.viewControllers[0] のようなもので別のコントローラーにアクセスできます。これにより、最初のタブのコントローラーが参照されます。したがって、文字列を 2 番目のコントローラーから最初のコントローラーに戻したい場合は、最初のコントローラー (たとえば、passedInString) に文字列プロパティを作成し、2 番目のコントローラーに次のようなものを作成します。

FirstViewController *first = self.tabBarController.viewControllers[0];
first.passedInString = self.stringToPass;
于 2013-11-15T00:06:37.677 に答える
0

OK @ user2994008、UITabBarControllerアプリのセットアップでは、何らかの方法で子ビューコントローラー間を強制的に結合する際に委任パターンを使用しません。通知を投稿することで仕事は完了します。唯一の問題は、通知の投稿をトリガーするものです。この場合、通知を viewWillDisapper: に投稿するのが手っ取り早い方法です。これは、ユーザーがタブを切り替えたときに呼び出されるためです。

SecondViewController.m

//SecondViewController.m
//this is the view with the UITextField in it
#import "SecondViewController.h

@implementation SecondViewController 

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"%s", __FUNCTION__);
    //since this gets called when the user switches tabs, i'll post the 
    //notification from this method

    //retrieve our text field's text and store it in a dictionary 
    NSDictionary *dict = @{"text":self.addDataTextField.text};

    //add the dictionary as userInfo: and post notification
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myAwesomeNotification" object:nil userInfo:dict];
}  
//all other second view controller methods here
@end 

FirstViewController.m

//FirstViewController.m
#import "FirstViewController.h"

@implementation FirstViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    //add an observer for the notification and tell it what method to call when it gets the notification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(actionTriggeredByNotification:) name:@"myAwesomeNotification" object:nil];
}

- (void)actionTriggeredByNotification:(NSNotification*)notification {
    NSLog(@"%s", __FUNCTION__);
    NSDictionary *userInfo = [notification userInfo];
    NSString *data = userInfo[@"text"];

    NSLog(@"Text data is: %@", data);
}

- (void)dealloc {
    //be sure to remove observer 
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    //if using ARC, don't call super dealloc
}
//all other first view controller methods
@end

また、そのようにデータを渡そうとするシングルトンのものをドロップします。それは本質的にグローバル変数を作成しようとすることになり、単純な文字列を渡すためにそれを本当に望んでいません。

ここでは通知を使用しても問題ありませんが、キー値監視 (KVO) を使用するか、UITextFieldDelegate プロトコルに準拠し、これらのデリゲート メソッドのいずれかからメッセージを送信することで、他のソリューションを実装できます。それでも、これらのテクニックはすべて、テキストフィールドのテキストを実際に いつ取得する必要があるかについて疑問を投げかけます。

ベアリングを取得したら、ReactiveCocoaを調べることを強くお勧めします。あなたのような問題を解決するために特別に設計されたライブラリです。

于 2013-11-15T00:18:41.087 に答える