iOS代表设置w / storyboarding

时间:2013-05-20 17:43:00

标签: ios uistoryboard

最近看了这个:

Passing Data between View Controllers

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

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

  

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

     

ViewControllerB * viewControllerB = [[ViewControllerB alloc]   initWithNib:@“ViewControllerB”bundle:nil]; viewControllerB.delegate =   self [[self navigationController] pushViewController:viewControllerB   动画: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是另一个选项卡。使用选项卡式应用程序时,可能是设置此选项的好方法,即如何在选项卡之间传递信息/数据。我认为通过代表仍然需要知道将它们连接在一起的位置。

1 个答案:

答案 0 :(得分:1)

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

也就是说,我将假设在SettingsViewController之后显示MainViewController,因此在加载SettingsViewController视图时不存在MainViewController的实例。在这种情况下,无论哪个控制器负责创建和呈现SettingsViewController的实例,都需要做一些事情来告诉MainViewController它已经这样做了。对此的一个很好的解决方案是通知,因为你想保持交叉耦合较低,而不是教这个类关于MainViewController的要求。

定义您自己的通知名称:

#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;
}