从UITabBarController问题中解除modalViewController

时间:2011-09-23 16:55:31

标签: iphone objective-c ipad modalviewcontroller

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

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

并且app delegate中定义的委托是:

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

这是我的LoginViewController:

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]时,它不会关闭模态视图控制器。

1 个答案:

答案 0 :(得分:0)

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

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

更新:

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