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 类来传递数据很舒服,因为它似乎违背了苹果的方式或 prepareforSegue 这对我不起作用。

我一直在四处寻找,但我发现大多数数据是从父级发送到子级的,但我没有看到基于选项卡的示例,其中 ChildViewController 可以将 NSString 发送到 ParentViewController 以在 UILabel 上显示该数据。

4

2 回答 2

0

好的@user2994008,在 UITabBarController 应用程序设置中,我不会子视图控制器之间以某种方式强制耦合时使用委托模式。发布通知将完成工作,唯一的问题是应该触发发布通知的内容。在这种情况下,一种快速而肮脏的方法是在 viewWillDisapper: 中发布通知,因为当用户切换选项卡时会调用它。

第二视图控制器.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 

第一视图控制器.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 回答
0

有几种方法可以做到这一点。从任何选项卡栏控制器的内容控制器,您可以使用 self.tabBarController.viewControllers[0] 之类的内容访问另一个控制器。这将引用第一个选项卡中的控制器。因此,如果您想将字符串从第二个控制器传回第一个控制器,请在第一个控制器中创建一个字符串属性(例如,passedInString),然后在第二个控制器中创建如下内容:

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