私のアプリケーションでは、ユーザーがツールバーの保存ボタンをクリックすると、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に不慣れです。