修改 Storyboard 后 ViewController 死循环

Posted

技术标签:

【中文标题】修改 Storyboard 后 ViewController 死循环【英文标题】:ViewController infinite loop after modifying Storyboard 【发布时间】:2014-06-01 03:56:10 【问题描述】:

自从实现一个用于侧架导航的库 (https://github.com/SocialObjects-Software/AMSlideMenu) 以来,我一直遇到 Navigation / ViewController 层次结构问题。这个库的实现与演示 ViewControllers 配合得很好(可以在链接的 Github 页面上看到),但是当我调整它以包含我之前使用的实际 ViewControllers 时(它们自己也可以正常工作),我的导航流程崩溃了。

我的应用的 ViewController 目前的结构如下:

导航控制器 登录视图控制器 主视图控制器(抽屉导航库启动的地方) SlideMenuLeftTableView 导航控制器 ItemsTable ViewController 添加照片视图控制器 添加ItemDetails ViewController 导航控制器 演示视图控制器

在实现货架导航库之前,我的故事板仅包含以下 ViewController,我没有遇到任何问题:

导航控制器 登录视图控制器 ItemsTable ViewController 添加照片视图控制器 添加ItemDetails ViewController

在 ItemsTable ViewController 中,正如预期的那样,用户会看到他们添加的 Items 的 TableView。和以前一样(在这一点上我们仍然很好),用户从 ItemsTable ViewController 中单击“添加”按钮并转到 AddPhoto ViewController。用户选择照片并被带到 AddItemDetails ViewController,用户在其中为这张照片添加标题。

不过,这里是它崩溃的地方。

项目上传本身确实有效,因为新添加的项目显示在我的 Parse 数据浏览器中,以及在我关闭并重新启动应用程序后的 ItemsTableView 中。但是,当我单击按钮以在 AddItemDetails ViewController 中添加项目时,我并没有将我带回 TableViewController 并更新项目列表以包含新项目,而是将我带回 UICameraPicker,在那里我陷入了一个循环为项目添加照片,但永远不会回到 TableViewController 来查看它们。当我单击 UICameraPicker 上的取消按钮时,我收到以下警告消息:

2014-05-31 23:04:26.312 GetGa[6872:90b] Presenting view controllers on detached view controllers is discouraged <UINavigationController: 0x10b637f60>.

AddPhoto ViewController(我陷入了循环)

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    if ([segue.identifier isEqualToString:@"givePhotoToGiveDetailsSegue"])
        if ([segue.destinationViewController isKindOfClass:[JFGiveItemDetailsVC class]])
            JFGiveItemDetailsVC *targetVC = segue.destinationViewController;
            targetVC.giveItemImage = self.giveItemImage;
        
    


-(void)viewDidAppear:(BOOL)animated


    UIImagePickerController *picker = [[UIImagePickerController alloc]init];
    picker.delegate = self;

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    else if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
        picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    
    [self presentViewController:picker animated:YES completion:nil];




-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info


    UIImage *image = info[UIImagePickerControllerEditedImage];
    if(!image) image = info[UIImagePickerControllerOriginalImage];

    self.giveItemImage = image;

    [self dismissViewControllerAnimated:YES completion:nil];
    [self performSegueWithIdentifier:@"givePhotoToGiveDetailsSegue" sender:self];




- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
    [self.navigationController popToRootViewControllerAnimated:YES];


AddItemDetails ViewController(这应该让我回到 ItemsTable ViewController)

-(BOOL)textFieldShouldReturn:(UITextField *)textField

    NSString *nameForGiveItem = self.giveItemTitleTextField.text;
    NSData *giveItemImageData = UIImagePNGRepresentation(self.giveItemImage);
    PFFile *giveItemImageFile = [PFFile fileWithName:nameForGiveItem data:giveItemImageData];
    PFObject *giveItemPhoto = [PFObject objectWithClassName:@"giveItemPhoto"];
    giveItemPhoto[@"imageOwner"] = [PFUser currentUser];
    giveItemPhoto[@"imageName"] = nameForGiveItem;
    giveItemPhoto[@"imageFile"] = giveItemImageFile;

    [giveItemPhoto saveInBackground];

    PFObject *giveItem = [PFObject objectWithClassName:@"giveItem"];
    giveItem[@"giveItemTitle"] = self.giveItemTitleTextField.text;
    giveItem[@"giver"] = [PFUser currentUser];
    [giveItem setObject:giveItemPhoto forKey:@"giveItemPhoto"];
    [giveItem saveInBackground];

    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

    return YES;

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。这是我所做的,在你的 - (void)viewDidAppear:(BOOL)animated 函数中写下这个:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
MJLoginViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[self.navigationController pushViewController:loginController animated:YES];

如果您使用的是 ios 7,那么 storyboardWithName:@"Main" 对您来说也是一样的。 MJLoginViewController 是我的 Main.Storyborad 和 instantiateViewControllerWithIdentifier:@"LoginViewController" 中的视图控制器类,您应该在这里写下您的故事板 ID 名称。如果你还没有给出一个继续分配一个。

运行,它会工作。

【讨论】:

以上是关于修改 Storyboard 后 ViewController 死循环的主要内容,如果未能解决你的问题,请参考以下文章

Xcode11中 Storyboard 页面跳转的一些修改

IOS多语言切换2-storyboard

无法插入新的插座集合 Xcode

xcode8 storyboard控件显示错位问题解决

Xcode修改storyboard大小

迁移到资产目录后,Storyboard 不显示资产