-1

次のコードを実行しているモーダルと呼ばれる呼び出しがあります。

    - (void)createAccessoryView
{

    CGRect frame = CGRectMake(0.0, self.frame.size.height, self.frame.size.width, 44.0);
    fieldAccessoryView = [[UIToolbar alloc] initWithFrame:frame];
    fieldAccessoryView.barStyle = UIBarStyleBlackOpaque;
    fieldAccessoryView.tag = 200;

    [fieldAccessoryView setBarStyle:UIBarStyleBlack];

    UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone  target:self action:@selector(done:)];

    UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Previous", @""), NSLocalizedString(@"Next", @""), nil]];
    [segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    [segmentedControl setMomentary:YES];
    UIBarButtonItem *segmentButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];

    [fieldAccessoryView setItems:[NSArray arrayWithObjects:segmentButton, spaceButton, doneButton, nil] animated:NO];

}

-(void)segmentAction:(id)selector
{

}

次に、Modalを拡張し、いくつかのUITextFieldを持つクラスを作成します。テキストフィールドをクリックすると、期待どおりにキーボードが表示されます。キーボードを起動すると、前/次のボタンと完了ボタンが表示されます。完了をクリックするとスローとエラーが発生し、segmentActionメソッドが適切に使用されません。理由はよくわかりません。

これが、[完了]ボタンをクリックした後に取得するスタックトレースです。

2013-03-13 15:54:33.956 myapp[74194:c07] -[NotesModal done:]: unrecognized selector sent to instance 0x80f3fb0
2013-03-13 15:54:33.961 myapp[74194:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NotesModal done:]: unrecognized selector sent to instance 0x80f3fb0'
*** First throw call stack:
(0x1b54012 0x1470e7e 0x1bdf4bd 0x1b43bbc 0x1b4394e 0x1484705 0x3b82c0 0x5f4a64 0x1484705 0x3b82c0 0x3b8258 0x479021 0x47957f 0x4786e8 0x3e7cef 0x3e7f02 0x3c5d4a 0x3b7698 0x1aafdf9 0x1ad7f3f 0x1ad796f 0x1afa734 0x1af9f44 0x1af9e1b 0x1aae7e3 0x1aae668 0x3b4ffc 0x1786d 0x24b5)
libc++abi.dylib: terminate called throwing an exception
4

3 に答える 3

1

このコード

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone  
                                                                            target:self 
                                                                            action:@selector(done:)];

メソッドが必要です

-(void)done:(id)selector
{
    //…
}

それを提供するか、に変更UIBarButtonItemします

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone  
                                                                            target:self 
                                                                            action:@selector(segmentAction:)];
于 2013-03-13T20:58:38.047 に答える
1

エラーの重要な部分はこれです:

[NotesModal done:]: unrecognized selector

したがって、メソッドを認識しないため、クラッシュしていdone:ます。

done:次のようなメソッドが実際にあることを確認してください。

 -(void)done:(id)sender
 {
      // whatever it does here...
 }

-(void)doneとは同じで-(void)done:(id)senderないことに注意してください。

于 2013-03-13T20:59:07.130 に答える
0

doneメソッドにパラメータがあるかどうかを確認してください。

次のようなものである必要があります。

-(void)done:(id)selector
{
    [self dismissModalViewController];
}
于 2013-03-13T20:59:40.527 に答える