2

私のアプリケーションでは、ユーザーがツールバーの保存ボタンをクリックすると、UIAlertViewを介して、画像として保存するかプレイとして保存するかを選択して、現在の作業を保存するかどうかを確認するメッセージが表示されます。ユーザーが[プレイとして保存]を選択すると、2番目のUIAlertViewが表示されます。このビューには、プレイの名前を挿入するためのテキストフィールドもあります。私が達成しようとしているのは、テキストが入力されていない場合は[OK]ボタンが無効になり、入力されたテキストの長さが1以上の場合、ファイルを保存できるようにすることです(アーカイバを使用すると、これは正しく機能します。これは問題ではありません)、[OK]ボタンが有効になります。以下にリストされているのは、2つのアラートビューと、ビューから異なるアイテムが選択されたときに何が起こるかを示すコードです。

- (IBAction)selectSaveType {
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@""
                                                  message:@"Please Select an Option."
                                                 delegate:self
                                        cancelButtonTitle:@"Save Play"
                                        otherButtonTitles:@"Save to Photos", nil];
[message show];

}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
if([title isEqualToString:@"Save Play"])
{
    NSLog(@"Save Play was selected.");
    [self GetFileName];
}
else if([title isEqualToString:@"Save to Photos"])
{
    NSLog(@"Save To Photos was selected.");
    //here is where we need to find how to call saveDrawing.
    [self saveDrawing];

}
else if([title isEqualToString:@"Ok"])
{
    NSLog(@"OK selected");
    UITextField *fName= [alertView textFieldAtIndex:0];
    NSString *NameFile = fName.text;
    [self savePlay:NameFile];


}

}

-(void)savePlay:(NSMutableString *)fileName{
//code here to save via archive.
   NSArray *pathforsave = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentDirectory = [pathforsave objectAtIndex:0];
    //here we need to add the file extension onto the file name before we add the name to the path
   [fileName appendString:@".hmat"];
   NSString *strFile = [documentDirectory stringByAppendingPathComponent:fileName];
[NSKeyedArchiver archiveRootObject:matView.drawables toFile:strFile];

}

私はこれを処理するために以下のコードを使用しようとしていますが、最初のUIAlertViewが起動すると(再生を選択するように求められます-テキストフィールドは存在しません)-以下の関数が実行され、アプリケーションがクラッシュします最初のアラートビューのテキストフィールド。

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
NSString *inputText = [[alertView textFieldAtIndex:0] text];
if( [inputText length] >= 1 )
{
    return YES;
}
else
{
    return NO;
}
}

最初のアラートが発生したときにalertViewShouldEnableFirstOtherButtonがヒットし、その後、シミュレーターでアプリケーションがクラッシュします。なぜこれが起こるのか誰かがわかりますか?よくわからないことが2つあります

1つ-プレイに名前を付けるための2番目のアラートビューの[OK]ボタンのハンドルが、他のボタンが処理されるのと同じブロックで処理される理由。個別のアラートビューなので、独自のブロックに含めるべきではありませんか?

2- 2番目のアラートビューにまだ到達していないときにalertViewShouldEnableFirstOtherButtonがヒットする理由は、最初のアラートビューで呼び出されて実行され、アプリがクラッシュします。

あなたの助けに感謝します、私はObjectiveCに不慣れです。

4

1 に答える 1

10

アラートビューのデリゲートメソッドは、表示するアラートビューに対して呼び出されます。textFieldAtIndex:0とはいえ、プレーンなアラートビューには存在しないため、このコードはクラッシュします。これを解決するには、どのアラートがアクションを呼び出したかを識別するifステートメントをデリゲートメソッドに追加するだけです。

編集:アラートを名前で識別しなくなりました。コードは、デリゲートの送信者のスタイルをチェックするようになりました。

  - (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
    if (alertView.alertViewStyle == UIAlertViewStylePlainTextInput) {
        if([[[alertView textFieldAtIndex:0] text] length] >= 1 )
        {
            return YES;
        }
        else
        {
            return NO;
        }
    }else{
        return YES;
    }
}
于 2012-10-03T16:21:24.093 に答える