3

私はiOS開発の初心者です。ストーリーボードを使用して別のページに移動するアプリを作成しました。

ここに画像の説明を入力

Add BarButton in Customer ページをクリックすると --> Add Customer ページに移動します ( ModalStoryboard Segue を使用) 。

そこで、ユーザー名とパスワードを入力して保存ボタンをクリックすると、-> 顧客ページに戻ります。

そして、すべてがうまくいきます。

back button問題は、[顧客の追加] ページに入れたいことです。PushStoryboard 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];

}

PushStoryboard Segue (戻るボタンを持つ) をどのように使用できますか?

4

3 に答える 3

8

まず第一に、ここでみんなが言っているように、2 番目のナビゲーション コントローラーを取り除きます。

次に、ストーリーボードで、「+」ボタンを Add Customer View Controller に直接接続し、セグエをプッシュとして設定します。

次に、Customer ビュー コントローラーのナビゲーション バーをクリックします。属性インスペクターで、このビューのタイトル ("Customer") を定義する必要があり、"Back Button" 行があるはずです。「Back」と入力すると、Add Customer ビュー コントローラーに [戻る] ボタンが表示されます。

prepareForSegue では、

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

Add Customer View コントローラーを閉じるには、次のように popViewControllerAnimated を使用します。

-(void) addCustomerViewControllerDidSave: (AddCustomerViewController *) Controller newCustomer: (Customer *) customer
{
    [self.customers addObject:customer];
    [self.tableview reloadData];
    [self.navigationController popViewControllerAnimated:YES];
}
于 2012-08-05T14:13:28.130 に答える
3

必要なナビゲーション コントローラーは 1 つだけです。2 番目のナビゲーション コントローラーを削除して、最初のテーブルから 2 番目のテーブルに直接セグエを設定してみてください。

編集:

popViewControllerAnimatedもっと注意深く見てみたところ、ではなくを使用する必要があると思いますdismissModalViewControllerAnimated。後者はモーダル用、前者はプッシュ用です。

于 2012-08-05T00:21:54.883 に答える
0

ナビゲーション コントローラーをプッシュすることはできません。そのシナリオで 2 番目のものが必要になるとは思えませんが、その使用法が役立つ場合があります。

ただし、スタイルをモーダル (またはカスタム - 独自のセグエ サブクラスの実装を提供する) に設定する必要があります。

完了したら、dismissViewControllerAnimated:completion: を呼び出して、ナビゲーション コントローラーを「ポップ」します。

于 2012-08-05T04:04:50.347 に答える