2012-08-05 57 views
3

我是iOS开发新手。我使用Storyboard创建了一个App来导航到不同的页面。如何使用push Storyboard Segue for NavigationController

enter image description here

当我点击添加BarButton客户页面 - >转到添加客户页面(使用Modal故事板Segue公司)

在那里,当我输入用户名和密码,并点击保存按钮 - >返回客户页面。

一切工作正常。

问题是我想在添加客户页面中有back button。我已经知道我可以使用Push故事板Segue公司,但是当我使用它,我面对一个错误:

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 

这是我在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 

而且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]; 

} 

你能不能帮我,我怎么可以使用Push故事板Segue公司(有后退按钮)?

+0

是,摆脱第二导航控制器。你如何继续添加客户视图控制器?什么样的赛格?这是一种模式吗? – 2012-08-05 01:12:46

+0

是的,它是莫代尔,它工作正常。 – Ali 2012-08-05 08:51:15

回答

8

首先,摆脱第二个导航控制器,就像大家在这里说的一样。

然后,在故事板中,直接将“+”按钮连接到添加客户视图控制器并将搜索设置为推送。

接下来,单击客户视图控制器的导航栏,在应该为此视图定义标题(“客户”)的属性检查器中,应该有一个“后退按钮”行。键入“返回”,您将在添加客户视图控制器中获得后退按钮。

在prepareForSegue,

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

要关闭添加客户视图控制器,使用popViewControllerAnimated如下:

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

对不起,我迟迟不回复。是的,你的代码完全正常工作。 – Ali 2012-08-15 22:16:26

3

您只需要一个导航控制器。尝试删除第二个导航控制器,并将第一个表中的segue直接设置为第二个。

编辑:

我花了谨慎看多,我认为你应该使用popViewControllerAnimated而非dismissModalViewControllerAnimated。后者用于模态,前者用于推动。

+0

我做到了这一点,但我也有这样的错误。我会为你发布错误。 – Ali 2012-08-05 00:23:23

+0

编辑。尝试如果这将工作。 – aforaudrey 2012-08-05 00:29:05

+0

是用于'popViewControllerAnimated'吗? – aforaudrey 2012-08-05 00:33:30

0

您无法推动导航控制器。我怀疑你在这种情况下需要第二个,但有时这种用法可以派上用场。

但是,您需要将样式设置为Modal(或自定义 - 并提供您自己的Segue子类实现)。

完成后,调用dismissViewControllerAnimated:completion:以“弹出”导航控制器。

相关问题