代码之家  ›  专栏  ›  技术社区  ›  Anh

在UITextView中撤消键入

  •  4
  • Anh  · 技术社区  · 16 年前

    我正在使用iphonesdk3.0。

    比如说,我通过设置 application.applicationSupportsShakeToEdit YES

    我用 - (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 根据用户键入的内容对文本视图进行更改。问题是它搞乱了默认的撤消操作。晃动设备不再显示“撤消键入”。

    我试图自己创建一个撤销管理器,但尚未成功。当我摇晃我的设备时,没有显示任何内容,即使我让撤销管理器注册了一些操作 prepareWithInvocationTarget .

    编辑 :我已经检查了WriteeRoom中iPhone的行为以及TextExpander Touch SDK示例代码,这两个示例代码都在抖动时显示撤消选项,直到自动完成。也就是说,当通过setText:向textView提交更改时,我猜是这样的。因此,更改textView的内容确实会对撤销机制产生一些影响。

    :问题是:在这种情况下,如何合并撤消功能?

    5 回复  |  直到 16 年前
        1
  •  4
  •   bentford Marko Hlebar    16 年前

    如何合并您自己的撤销? 这是最简单的方法。

    注意:这不响应模拟器中的抖动手势。

    @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 -
    
        2
  •  1
  •   slf    16 年前

    applicationSupportsShakeToEdit YES 所以真的不需要打开它。

    如果没有代码,我不确定您的问题是什么,但通过返回 NO 在…上 UITextViewDelegate textView:shouldChangeTextInRange 你可能会使电源短路。您可能需要检查委托方法内部的逻辑,以确保不会发生这种情况,或者可能需要使用不同的委托消息,如 textViewDidChange: 相反

        3
  •  0
  •   Steve Weller    16 年前

        4
  •  0
  •   mr-sk    16 年前