1

最近读到这个:

在视图控制器之间传递数据

其中概述了两个控制器之间的委托设置。我遇到的问题是控制器之间没有segue。而且我不确定我是否要在这两个控制器之间进行切换,即我不想在值更新时更改视图,在幕后我只想让另一个控制器知道值确实发生了变化。

这是我从上面的链接绊倒的步骤:

在我们将 ViewControllerB 推送到导航堆栈之前,我们需要做的最后一件事是告诉 ViewControllerB ViewControllerA 是它的委托。

ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.delegate = self [[self navigationController] pushViewController:viewControllerB animated:YES];

我没有使用笔尖,我也不认为为 segue 做准备是连接代表的正确位置。我应该在其他地方给代表接线吗?

这是我的代码:SettingsVeiwController,想让另一个控制器知道用户何时更新刷新率字段。

#import <UIKit/UIKit.h>

@protocol SettingsViewControllerDelegate <NSObject>
-(void) didUpdateRefreshRate:(NSString *)refreshRate;
@end

@interface SettingsViewController : UITableViewController <UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *refreshRateTextField;

@property (copy, nonatomic) NSNumber *refreshRate;

@property (weak, nonatomic) id <SettingsViewControllerDelegate> delegate;

@end

MainViewController,想在 refreshRate 变化时获取更新,

@interface MainViewController ()

@end

@implementation MainViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void) didUpdateRefreshRate:(NSString *)refreshRate {
    NSLog(@"This was returned from SettingsViewController %@",refreshRate);
}

@end

我认为一切设置正确,除了告诉 SettingsViewController MainViewController 是它的代表。

可能最重要的是这是一个选项卡式应用程序。MainViewController 是一个选项卡,SettingsViewController 是另一个选项卡。使用选项卡式应用程序时可能是设置它的好方法,即如何在选项卡之间传递信息/数据。我假设它通过代表仍然只需要知道在哪里将它们连接在一起。

4

1 回答 1

1

一个好地方是MainViewController viewDidLoad(假设MainViewController与 的呈现无关SettingsViewController)。您只需要获取 的实例SettingsViewController并将其委托设置为self.

也就是说,我将假设它SettingsViewController是在 之后呈现的,因此在加载 s 视图时不存在的MainViewController实例。在这种情况下,无论哪个控制器负责创建和呈现一个实例,都需要做一些事情来表明它已经这样做了。一个很好的解决方案是通知,因为您希望保持低交叉耦合并且不教这门课关于.SettingsViewControllerMainViewControllerSettingsViewControllerMainViewControllerMainViewController

定义您自己的通知名称:

#define SettingsViewControllerWasCreatedNotification @"SettingsViewControllerWasCreatedNotification"

设置MainViewController为观察者:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(settingViewControllerShown:)
                                                 name:SettingsViewControllerWasCreatedNotification
                                               object:nil];
}

创建后SettingsViewController,发布通知

[[NSNotificationCenter defaultCenter] postNotificationName:SettingsViewControllerWasCreatedNotification
                                                    object:settingsViewController];

新的设置视图控制器是对象。现在,您MainViewController将收到回调并可以将自己添加为委托:

- (void)settingViewControllerShown:(NSNotification *)note
{
    SettingsViewController *settingsViewController = (SettingsViewController *)[note object];
    settingsViewController.delegate = self;
}
于 2013-05-20T18:39:15.253 回答