【问题标题】:iOS: Accessing the same instance of UIViewController that called the SegueiOS:访问调用 Segue 的同一 UIViewController 实例
【发布时间】:2013-04-27 22:01:47
【问题描述】:

我有两个视图控制器。 MainViewController 推送 SignUp ViewController。一旦 SignUp View Controller 关闭,我需要访问 MainViewController 的同一实例来更新 UIButton.title。

.h 主视图

//MainViewController.h
#import <UIKit/UIKit.h>


@interface MainViewController : UITableViewController 
-(void)loggedIn;

@end

.m

@interface MainViewController ()

@end    

-(void)loggedIn
{
    NSLog (@"This is Logged in inside MainView.m");
    self.logInOutButton.title = @"Logout";
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = segue.destinationViewController;
    Signup *signUp = [destinationViewController isKindOfClass:[SignUp class]] ? (Signup*)destinationViewController : nil;
    signUp.mainViewController = self;
    NSLog(@"Preapre For Segue %@", self);
}

.h 注册

#import <UIKit/UIKit.h>
#import "MainViewController.h"
@interface SignUp : UIViewController 
@property (strong, nonatomic) MainViewController *mainViewController;
@end

.m

@synthesize mainViewController;

- (void) loggedIn
{
    NSLog(@" MainViewController %@", mainViewController);
    [mainViewController loggedIn];
    self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

当我执行 NSLog 时,我得到了不同的值:

Preapre For Seg <STMainViewController: 0x9f7d600>
MainViewController (null)

【问题讨论】:

  • 您是否尝试过在分配 mainViewController 后记录注册视图控制器是什么?看起来两者之间可能有一个中间控制器,很可能是导航控制器......
  • 在设置mainViewController 属性之前检查signUp 是否为nil
  • 参见stackoverflow.com/a/9736559/1271826的“传回数据”部分中对委托协议的讨论
  • 您在类的声明中使用带有大写 U 的 SignUp。然后在 MainViewController 中使用带有小写 U 的 Signup。这将导致 signUp 为零。这可能是因为您在此处重新键入而不是复制和粘贴。如果是这种情况,请直接复制并粘贴,因为它可能会显示一些您没有预料到的错误。

标签: ios storyboard segue


【解决方案1】:

创建协议/委托。关于如何实现这一点有很多资源。总之,您使用希望在源上运行的方法在目标 viewController 上创建协议,然后从源 viewController 订阅该委托。

Protocol Delegate

不要忘记在您的 prepareForSegue 方法中设置委托

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    Signup *signUp = segue.destinationViewController;
    signup.delegate = self;
    NSLog(@"Preapre For Segue %@", self);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多