4

iPhone SDK 3.0 を使用しています。

たとえば、アプリのデリゲートでに設定application.applicationSupportsShakeToEditして、 「シェイクして元に戻す」を有効にしました。YESRootViewController に UITextView を作成し、アプリの起動時にファーストレスポンダーにしました。

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)textユーザーの入力内容に応じて、テキスト ビューを変更するために使用します。問題は、デフォルトの元に戻すアクションが台無しになっていることです。デバイスを振っても、「入力を元に戻す」が表示されなくなりました。

自分で元に戻すマネージャーを作成しようとしましたが、まだ成功していません。元に戻すマネージャーに何らかのアクションを登録させたにもかかわらず、デバイスを振っても何も表示されませんprepareWithInvocationTarget

誰にもアイデアがありますか?

編集: iPhone の WriteRoom の動作と TextExpander Touch SDK のサンプル コードを確認しました。どちらも、オートコンプリートが行われるまで振ると元に戻すオプションが表示されます。つまり、変更が setText: を介して textView にコミットされたときだと思います。そのため、textView のコンテンツを変更すると、元に戻すメカニズムに何らかの影響があります。

EDIT 2 :問題は、この場合、元に戻す機能をどのように組み込むことができるかということです。

4

4 に答える 4

4

独自のアンドゥを組み込む方法 これが可能な最も簡単なアプローチです。

注: これは、シミュレーターでのシェイク ジェスチャには反応しません。

UndoTestViewController.h:

@interface UndoTestViewController : UIViewController <UITextViewDelegate, UIAccelerometerDelegate>{
    IBOutlet UITextView *textview;
    NSString *previousText;
    BOOL showingAlertView;
}
@property (nonatomic,retain) NSString *previousText;
@end

UndoTestViewController.m:

@implementation UndoTestViewController
@synthesize previousText;

- (void)viewDidLoad {
    [super viewDidLoad];

    //disable built-in undo
    [UIApplication sharedApplication].applicationSupportsShakeToEdit = NO;

    showingAlertView = NO;

    [UIAccelerometer sharedAccelerometer].delegate = self; 
    [UIAccelerometer sharedAccelerometer].updateInterval = kUpdateInterval;

    //set initial undo text
    self.previousText = textview.text;
}

#pragma mark UITextViewDelegate
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    //save text before making change
    self.previousText = textView.text;

    //changing text in some way...
    textView.text = [NSString stringWithFormat:@"prepending text %@",textView.text];
    [textView resignFirstResponder];
    return YES;
}
#pragma mark -

#pragma mark UIAccelerometerDelegate
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 

    if( showingAlertView ) return;

    if ( acceleration.x > kAccelerationThreshold || 
        acceleration.y > kAccelerationThreshold || 
        acceleration.z > kAccelerationThreshold ) {


        showingAlertView = YES;
        NSLog(@"x: %f y:%f z: %f", acceleration.x, acceleration.y, acceleration.z);


        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Undo Typing", nil];
        alert.delegate = self;
        [alert show];
        [alert release];
    }
}
#pragma mark -

#pragma mark UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if( buttonIndex == 1 ) {
        textview.text = self.previousText;
    }
    showingAlertView = NO;
}
#pragma mark -
于 2010-01-06T17:23:29.693 に答える
1

applicationSupportsShakeToEditのデフォルト値は であるYESため、オンにする必要はありません。

あなたの質問/問題がコードなしでは正確にはわかりませんがNOUITextViewDelegate textView:shouldChangeTextInRangeに戻ることで、 UndoManager の魔法が起こっていることを短絡させている可能性があります。そのデリゲート メソッド内のロジックを確認して、それが発生していないことを確認するか、textViewDidChange:代わりに別のデリゲート メッセージを使用する必要がある場合があります。

于 2010-01-05T15:25:03.223 に答える
0

少なくとも 3.1 の実装にはバグがあることがわかり、アプリで undo をまったく使用しないことにしました。このバグには、特定の状況下で追加の取り消しを追加する取り消しメカニズムが含まれていたため、ユーザーにメッセージを表示しても意味がありませんでした。

于 2010-01-03T00:07:55.520 に答える
0

ここのソース コードを見たことがありますか: http://github.com/dcgrigsby/TallyTrucks/tree/master NSUndoManager の基本的な (動作する) 実装があります。おそらくそれは役立つかもしれません。

于 2010-01-05T21:16:14.727 に答える