【问题标题】:dismissing modalViewController from UITabBarController issue从 UITabBarController 问题中解散 modalViewController
【发布时间】:2011-09-23 16:55:31
【问题描述】:

所以在我的应用委托中,我尝试通过执行以下操作从 UITabBarController 呈现 modalViewController:

self.tabBarController = [[UITabBarController alloc] init];
LoginViewController* loginViewController = [[LoginViewController alloc] init];
        loginViewController.delegate = self;
        [self.tabBarController presentModalViewController:loginViewController animated:NO];
        [loginViewController release];

而应用委托中定义的委托是:

- (void)userDidLogin:(LoginViewController *) loginViewController
{
    NSLog(@"DELEGATE CALLED, DISMISSING");
    [self.tabBarController dismissModalViewControllerAnimated:NO];
}

这是我的登录视图控制器:

protocol LoginViewControllerDelegate;

@interface LoginViewController : UIViewController <MBProgressHUDDelegate>
{


    id<LoginViewControllerDelegate> delegate;
}

@property (assign) id<LoginViewControllerDelegate> delegate;

@end


@protocol LoginViewControllerDelegate

- (void)userDidLogin:(LoginViewController *) loginViewController;

@end

问题是这个(userDidLogin:(LoginViewController *) loginViewController) 永远不会被调用......这是为什么? 我在我的 LoginViewController 实现中调用了以下内容,这被称为

[self.delegate userDidLogin:self];

更新:

我现在接到了代表的电话。现在的问题是,当我调用 [self.tabBarController dismissModalViewControllerAnimated:YES] 时,它不会关闭模态视图控制器。

【问题讨论】:

  • 但是 LoginViewController 确实出现了?
  • 尝试用笔尖初始化它。
  • 是的,当我使用 presentModalViewController 时,LoginViewController 会出现
  • 现在的问题是我的应用程序委托中的委托函数从未被调用...我在我的应用程序委托中添加了

标签: iphone objective-c ipad modalviewcontroller


【解决方案1】:

您没有从 LoginViewController 发布任何代码,但是在该类的代码中,您需要在准备关闭它时添加以下行(可能是当用户单击“登录”按钮并且登录成功时)。

if (delegate && [delegate respondsToSelector:@selector(userDidLogin:)])
     [delegate performSelector:@selector(userDidLogin:) withObject:self];

更新:

我想我明白这里的问题所在。根据 Apple 的文档,当您调用 presentModalViewController:animated: 方法时,该方法会设置 UIViewController(在本例中为您的 UITabBar)的“modalViewController”属性的值。但是,该属性仅维护对 modalViewController 的弱引用。这很重要,因为您初始化 LoginViewController,将其传递给 presentModalViewController:animated:,然后释放它。由于 presentModalViewController:animated: 没有保留对 LoginViewController 的强引用,因此 UITTabBar 稍后无法将其关闭。事实上,我很惊讶你所做的并没有导致 EXC_BAD_ACCESS 崩溃。我建议你删除“[loginViewController release]”语句,而是在调用“[self.tabBarControllerdismissModalViewControllerAnimated:NO]”后释放它

【讨论】:

  • 我只是在调用 [delegate userDidLogin:self] 之前检查了 if(delegate == nil) 并且它返回 true.. 但是为什么呢?我已经分配好了
  • 好吧..现在更进一步..调用了 delgate,但是现在当我调用 [self dismissModalViewControllerAnimated:YES];它没有拒绝它。但是,如果我尝试从 LoginViewController 中将其关闭,它会自行工作..
  • 请查看我上面原始答案的更新。我认为问题在于您过早地发布了 LoginViewController。在释放对 LoginViewController 的引用之前,您必须解除使用 dismissModalViewControllerAnimated:。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多