【发布时间】:2012-12-27 07:29:57
【问题描述】:
我的问题可能是一种技术,而不是对如何设置控制器和委托的误解。也就是说,也许我应该采取不同的方式......
无论如何,我有一个带有 mainViewController 的情节提要设置。其中有一个UIButton,单击它时会转到一个弹出窗口。弹出框的内容视图控制器是UINavigationController,而rootViewController 是MyViewController。
我正在尝试将mainViewController 设为delegate 的MyViewController,并在prepareForSegue 中这样做:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:(@"popSleepSegue")] || [segue.identifier isEqualToString:(@"popAlarmSegue")])
{
UIStoryboardPopoverSegue *popSegue = (UIStoryboardPopoverSegue *)segue;
popSegue.popoverController.delegate = self;
popSegue.popoverController.passthroughViews = [NSArray arrayWithObject:self.view];
if ([segue.identifier isEqualToString:@"popAlarmSegue"])
{
if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]])
{
UINavigationController *uNC = (UINavigationController *)[segue destinationViewController];
MyViewController *aVC = (MyViewController *)uNC.topViewController;
aVC.popController = popSegue.popoverController;
aVC.delegate = self;
}
}
}
}
当MyViewController 加载时,[self.delegate class] 在NSLog 中以null 的形式出现。当然,delegate 回调不会在 mainViewController 中收到。
基本上,我是在尝试模仿 Apple 日历应用在 iPad 上的行为。
我正在尝试使用委托按照习语向上游传递数据。诀窍是我试图通过UINavigationController 设置delegate,这是一个弹出框的内容视图。听起来太复杂了。也许还有其他成语?
同时,我要试一试 NSNotificationCenter。
【问题讨论】:
-
奇怪的是,当我在这里得到
null时:[self.delegate class]在 MyViewController 的 viewDidLoad 中实际上触发了回调。奇怪。 -
我刚刚在 MyViewController 中创建了一个测试变量:
@property (nonatomic, strong) NSString *testString;并试图在 segue 中设置它并在 MyViewController 的视图中打印出来确实加载了。没用。我的猜测是 MyViewController 在 segue 时不存在 - UINavigationController(即目标视图控制器)是唯一存在的。嗯。 -
天哪 - 如果我在调用委托协议之前将 [self.delegate 类](和 testString)的 NSLog 打印输出从 viewDidLoad 移动到右侧,那么它们确实打印正确,显示委托(和 testString)确实是在 prepareForSegue 中设置的。有任何想法吗? @properties 直到 viewDidLoad 之后才设置吗?
标签: objective-c ios delegates uinavigationcontroller