简体   繁体   中英

How to use push Storyboard Segue for the NavigationController

I am new in iOS development. I created an App using Storyboard to navigate to different pages.

在此输入图像描述

When I click on the Add BarButton in Customer page --> go to the Add Customer Page.(using Modal Storyboard Segue)

There, when I enter username and password and click on save button --> come back to Customer page.

And everything works fine.

The problem is I want to have back button in Add Customer page. I already know that I can use Push Storyboard Segue, but when I use it I face with an error:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'
*** First throw call stack:
(0x13cb022 0x155ccd6 0xeff1b 0xefa24 0x44bde6 0x4404d0 0x13cce99 0x1814e 0x256a0e 0x13cce99 0x1814e 0x180e6 0xbeade 0xbefa7 0xbe266 0x3d3c0 0x3d5e6 0x23dc4 0x17634 0x12b5ef5 0x139f195 0x1303ff2 0x13028da 0x1301d84 0x1301c9b 0x12b47d8 0x12b488a 0x15626 0x25ed 0x2555)
terminate called throwing an exception(lldb) 

CustomerViewController.h:

#import "AddCustomerViewController.h"
    @interface CustomerViewController : UITableViewController<AddCustomerViewControllerDelegate>
    {
        IBOutlet UITableView *tableview;
        NSMutableArray *customers;
    }

    @property(nonatomic,retain)IBOutlet UITableView *tableview;
    @property(nonatomic,retain)NSMutableArray *customers;

    @end

This is the code I use in CustomerViewController.m:

self.customers = [[NSMutableArray alloc]init]; 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"AddCustomer"])
    {
        UINavigationController *navigationController = segue.destinationViewController;
        AddCustomerViewController *addCustomerViewController = [[navigationController viewControllers] objectAtIndex:0];
        addCustomerViewController.delegate = self;
    }
}

-(void) addCustomerViewControllerDidSave: (AddCustomerViewController *) Controller newCustomer: (Customer *) customer
{
    [self dismissViewControllerAnimated: YES completion:NULL];
    [self.customers addObject:customer];
    [self.tableview reloadData];
}

AddCustomerViewController.h:

#import "Customer.h"

@class AddCustomerViewController;

@protocol AddCustomerViewControllerDelegate <NSObject>

-(void) addCustomerViewControllerDidSave: (AddCustomerViewController *) Controller newCustomer: (Customer *) customer;

@end

@interface AddCustomerViewController : UITableViewController
{

}

@property (nonatomic, weak) id <AddCustomerViewControllerDelegate> delegate;

@property (nonatomic, strong) IBOutlet UITextField *firstnameTxt;
@property (nonatomic, strong) IBOutlet UITextField *lastnameTxt;

- (IBAction)save:(id)sender;

@end

And AddCustomerViewController.m:

- (void)save:(id)sender 
{
    NSLog(@"Save");
    Customer *newCustomer = [[Customer alloc]init];
    newCustomer.firstname = self.firstnameTxt.text;
    newCustomer.lastname = self.lastnameTxt.text;
    [self.delegate addCustomerViewControllerDidSave:self newCustomer:newCustomer];

}

Can you help me how can I use Push Storyboard Segue (to have back button) ?

First of all, get rid of the second navigation controller like what everybody here are saying.

Then, in storyboard, connect the "+" button directly to Add Customer View Controller and set the segue as push.

Next, click on the navigation bar of Customer view controller, in the attributes inspector where you should have defined the title ("Customer") for this view, there should be a "Back Button" row. Type "Back" and you will get a Back button in Add Customer view controller.

In prepareForSegue,

if([segue.identifier isEqualToString:@"AddCustomer"])
{    
    AddCustomerViewController *addCustomerViewController = segue.destinationViewController;
    addCustomerViewController.delegate = self;
}

To close Add Customer View controller, use popViewControllerAnimated as follows:

-(void) addCustomerViewControllerDidSave: (AddCustomerViewController *) Controller newCustomer: (Customer *) customer
{
    [self.customers addObject:customer];
    [self.tableview reloadData];
    [self.navigationController popViewControllerAnimated:YES];
}

You only need one navigation controller. Try delete the second navigation controller and set the segue from your first table directly to your second one.

Edit:

I took a more careful look and I think you should use popViewControllerAnimated rather than dismissModalViewControllerAnimated . The latter is for modal, the former is for push.

You can't push a navigation controller. I doubt you need the second one in that scenario, but sometimes that usage can come in handy.

However, you need to set the style to Modal (or Custom - and provide your own segue subclass implementation).

When done, call dismissViewControllerAnimated:completion: to "pop" the navigation controller.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM