【问题标题】:Getting the current instance of ViewController获取 ViewController 的当前实例
【发布时间】:2012-09-06 05:33:36
【问题描述】:

我正在实现一个登录系统。

//LoginViewController.m
- (IBAction)loginButtonPress:(id)sender {
    (...)
   [[LoginSession sharedInstance] authenticateUser:[username text] withPassword:[password text] andDomain:[domain text]];
}


//LoginSession.m
- (void) authenticateUser:(NSString *)userName withPassword:(NSString *)password andDomain:(NSString *)domain{
    (...)
     RKRequest * loginRequest = [[RKClient sharedClient] get:@"/login" queryParameters:loginData delegate:self];
    (...)
}

此请求完成后,它会调用委托:

//LoginSession.m
- (void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response;

这需要回调 LoginViewController,以显示错误或允许用户访问应用程序。

我尝试使用 Storyboard 实例化 LoginViewController,但结果证明它正在创建一个新实例:

//LoginSession.m
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
    
LoginViewController *loginViewController =
(LoginViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"loginViewController"];

我什至尝试将LoginViewController's self 存储在LoginSession 的属性中: (会出错)

//LoginSession.m
@property (strong, retain) LoginViewController *loginViewController;

那么,联系ViewController 的当前活动实例的正确方法是什么?

【问题讨论】:

    标签: objective-c ios uiviewcontroller delegates restkit


    【解决方案1】:

    你可以使用

    • 委托模式,在 iOS 中无处不在
    • 通知模式,例如NSNotificationCenter

    【讨论】:

    • 好的,所以我可以替换 RKRequest * loginRequest = [[RKClient sharedClient] get:@"/login" queryParameters:loginData delegate:self]; 'self' 的东西,所以我可以委托给 LoginViewController,但我应该写什么而不是 self?
    【解决方案2】:
    //LoginSession.h
    @property (strong, retain) LoginViewController *loginViewController; 
    
    @synthesize loginViewController;
    
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
    loginViewController =
    (LoginViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"loginViewController"];
    

    推送或展示 loginViewController

    并使用 loginViewController 调用委托方法

    【讨论】:

    • 我试过这个,正如我所说的,但它会像一个新实例一样工作。
    • 它是初始视图控制器,不能推送;(
    • LoginSession 是一个单例,因此您可以执行类似的操作来在 LoginSession 中推送或呈现 VC -(void)pushLoginVCOnViewController:(id)anController{ UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"捆绑:无]; loginViewController = (LoginViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"loginViewController"]; [anController.navigationController pushViewController:loginViewController 动画:YES]; }
    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 2011-12-22
    • 2023-03-24
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多