次の行を appDelegate のメソッドapplication:didFinishLaunchingWithOptions:
に挿入します。
application.applicationSupportsShakeToEdit = YES;
および関連する viewController.m で
-(BOOL)canBecomeFirstResponder {
return YES;
}
このコードの残りの部分は、viewController.m に入ります。
プロパティ
これをクラス拡張に入れます...
@interface myViewController()
@property (weak, nonatomic) IBOutlet UITextField *inputTextField;
@end
それを Interface Builder のテキスト フィールドにリンクします。
Undo メソッド
自分自身の呼び出しを REDO スタックに追加します
- (void)undoTextFieldEdit: (NSString*)string
{
[self.undoManager registerUndoWithTarget:self
selector:@selector(undoTextFieldEdit:)
object:self.inputTextField.text];
self.inputTextField.text = string;
}
(NSUndoManager インスタンスを作成する必要はありません。UIResponder スーパークラスから継承します)
アクションを元に戻す
シェイクして元に戻すには必要ありませんが、便利な場合があります...
- (IBAction)undo:(id)sender {
[self.undoManager undo];
}
- (IBAction)redo:(id)sender {
[self.undoManager redo];
}
undo メソッドの呼び出し
textField のコンテンツを変更する 2 つの異なる例を以下に示します…</p>
例 1
ボタン アクションから textField のコンテンツを設定する
- (IBAction)addLabelText:(UIButton*)sender {
[self.undoManager registerUndoWithTarget:self
selector:@selector(undoTextFieldEdit:)
object:self.inputTextField.text];
self.inputTextField.text = @"text";
}
明確さを失うリスクがありますが、これを次のように短縮できます。
- (IBAction)addLabelText:(UIButton*)sender {
[self undoTextFieldEdit: @"text"];
}
undoManager の呼び出しは両方のメソッドで同じであるため
例 2
直接キーボード入力編集
#pragma mark - textField delegate methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
[self.undoManager registerUndoWithTarget:self
selector:@selector(undoTextFieldEdit:)
object:textField.text];
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
//to dismiss the keyboard
[textField resignFirstResponder];
return YES;
}