最近看了这个:
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是另一个选项卡。使用选项卡式应用程序时,可能是设置此选项的好方法,即如何在选项卡之间传递信息/数据。我认为通过代表仍然需要知道将它们连接在一起的位置。
答案 0 :(得分:1)
一个好的地方是MainViewController viewDidLoad
(假设MainViewController
与SettingsViewController
的呈现无关。您只需获取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;
}