【问题标题】:Cannot Use PrepareForSegue Back to Back不能使用 PrepareForSegue 背靠背
【发布时间】:2015-09-08 16:32:22
【问题描述】:

我一直试图弄清楚为什么这不起作用但没有运气:

我正在 Xcode 中制作一个 IOS 应用程序并将其设置为:我首先从 ViewControllerA (LoginViewController) 转到 ViewControllerB (HomeViewController)。在这个 segue 中,我传递了一个 UIImage 和一个 UILabel 以显示在 ViewControllerB 中。一旦发生这种情况,我想设置另一个 prepareForSegue 以转到 ViewControllerC (ProfileViewController) 并再次传递相同的数据。但是,每次我尝试这样做时,应用程序都会出现故障并崩溃或冻结。我不太确定为什么会这样。

我希望有一种方法可以不必每次我想传递数据时都执行 prepareForSegue - 比如全局变量或单例。 但是我试图避免使用这两个选项,因为我已经读过很多次这些选项是危险的,不应该真正使用。 如果这两种方式中的任何一种在这里是合适的,那么一定要让我知道,这将是它的结束。

与此同时,我想看看是否有人可以帮助我了解为什么此错误不断发生。这是我的 ViewControllerA.m 代码:​​

LoginViewController.m

#import "LoginViewController.h"
#import <QuartzCore/QuartzCore.h>


@interface LoginViewController ()

- (void)toggleHiddenState:(BOOL)shouldHide;

@end

@implementation LoginViewController

@synthesize profPicture;


- (void)viewDidLoad {
    [super viewDidLoad];

    [self toggleHiddenState:YES];
    self.lblLoginStatus.text = @"";

    self.loginButton.readPermissions = @[@"public_profile", @"email"];
    self.loginButton.delegate = self;

    // Do any additional setup after loading the view.
}

-(void)toggleHiddenState:(BOOL)shouldHide{
    self.lblUsername.hidden = shouldHide;
    self.lblEmail.hidden = shouldHide;
    self.profilePicture.hidden = shouldHide;
    self.loggedinwallpaper.hidden = shouldHide;
    self.FBlogout.hidden = shouldHide;
}


-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView{
    self.lblLoginStatus.text = @"";

    [self toggleHiddenState:NO];
}

-(void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView{
    self.lblLoginStatus.text = @"";

    [self toggleHiddenState:YES];
}

-(void)loginViewFetchedUserInfo:(FBLoginView *)loginView user:(id<FBGraphUser>)user{

    NSLog(@"%@", user);
    //dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){


        self.profilePicture.profileID = user.objectID;
        self.lblUsername.text = user.name;
        self.lblEmail.text = [user objectForKey:@"email"];

        // Create Facebook Profile Picture from User ID url
        NSString *pic_link = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?width=300&height=300", user.objectID];
        NSURL *pic_url = [NSURL URLWithString:pic_link];
        profPicture = [UIImage imageWithData: [NSData dataWithContentsOfURL:pic_url]];

        //dispatch_async(dispatch_get_main_queue(), ^(void){
            //Main Thread : UI Updates
//            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//            UIViewController *homeViewController = (UIViewController *)[storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
//            [self performSelector:@selector(prepareForSegue:sender:) withObject:nil afterDelay:1.0 ];
//            [self presentViewController:homeViewController animated:YES completion:nil];

            //[_invisible                         sendActionsForControlEvents:UIControlEventTouchUpInside];
            [self performSegueWithIdentifier:@"showMap" sender:self];

       //});
    //});
}


-(void)loginView:(FBLoginView *)loginView handleError:(NSError *)error{
    NSLog(@"%@", [error localizedDescription]);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    HomeViewController *homeviewController = segue.destinationViewController;
    homeviewController.homepic = [[UIImage alloc] init];
    homeviewController.homepic = profPicture;
    homeviewController.username = self.lblUsername;
}


@end

现在这是我的 ViewControllerB 代码:

HomeViewController.m

#import "HomeViewController.h"
#import "LoginViewController.h"
#import "ProfileViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController

@synthesize homeviewpic, homepic, sendpic, homeViewUsername, username;

- (void)viewDidLoad {
    [super viewDidLoad];


    //----------Profile Picture---------------------------------------
    // Determine the context of where to set image.
    UIGraphicsBeginImageContext(self.homeviewpic.frame.size);
    [homepic drawInRect:self.homeviewpic.bounds];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Create subview to be added
    UIImageView *backgroundView = [[UIImageView alloc] initWithImage:image];

    // Add subview
    [self.homeviewpic addSubview:backgroundView];
    [self.homeviewpic setContentMode:UIViewContentModeScaleAspectFill];

    sendpic = homepic;



    //----------Username-----------------------------------------------
    //homeViewUsername.text = username.text;



        // Do any additional setup after loading the view.
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear: animated];
    self.homeViewUsername.text = self.username.text;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


//-----------------------------Screenshot of background void method--------------------------------
- (UIImage *) screenshot {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);

    [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;

}
//-------------------------------------------------------------------------------------------------


#pragma mark - Navigation

 //In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    ProfileViewController *PVC = segue.destinationViewController;
    //PVC.profPic = sendpic;
    //PVC.profileViewUsername = username;
}


@end

现在我已经注释掉了 prepareForSegue 中的行 - 这些行是问题的根源。如果有人可以帮助解释并尝试提供解决方案,我将非常感激。谢谢!

【问题讨论】:

  • 你在视图控制器 B 的哪里执行 segue?
  • 带有按钮。我把它编码了,但我把它拿出来了,因为它也不起作用
  • @KakshilShah 每次我尝试通过 prepareForSegue 引入新的数据传输设置时,我都会一直崩溃/冻结。我不确定如何解决这个问题,因为我需要将此数据传递给下一个 VC ..

标签: ios objective-c xcode uiviewcontroller segue


【解决方案1】:

您试图在 dispatch_async 中显示两个视图控制器。 presentViewController 和 performSegueWithIdentifier 做同样的事情。您必须设置一些条件,以便在您的 dispatch_async 方法中调用其中一个条件。尝试呈现两个视图控制器会崩溃。

【讨论】:

  • 除了 [self performSegueWithIdentifier:@"showMap" sender:self]; 之外,我对所有内容都进行了评论。如果是这样的话,那不应该只是一个segue吗?
  • 您的应用程序也因该注释代码而冻结/崩溃?
  • 是的。我不知道它为什么会结冰。当我取消注释 HomeViewController 中 prepareForSegue 中的几行时,它会出错。它一定不希望我两次共享同一条数据。我很茫然
  • 尝试移动 homeviewController.homepic = [[UIImage alloc] init];在 viewDidLoad
  • 根本不起作用:\因为它不知道 ViewDidLoad 方法中的 HomeViewcontroller 无论如何
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 2021-03-21
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多