我正在尝试创建一个用户可以添加条目的iPhone应用程序.当他按下一个新条目时,会弹出一个框,询问他一些信息.然后他可以按"取消"或"保存"以丢弃数据或将其保存到磁盘.
为了保存,我使用的是Core Data框架,它运行得很好.但是,我无法使用"取消"按钮.当窗口弹出,询问信息时,我在托管对象上下文(MOC)中创建一个新对象.然后当用户按下取消时,我尝试使用属于MOC的NSUndoManager.
我还想使用嵌套的撤消组来执行此操作,因为可能存在嵌套组.
为了测试这个,我写了一个简单的应用程序.该应用程序只是启用了Core Data的"基于Window的应用程序"模板.对于Core Data模型,我创建了一个名为"Entity"的实体,其整数属性为"x".然后在applicationDidFinishLaunching中,我添加以下代码:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
unsigned int x=arc4random()%1000;
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager beginUndoGrouping];
NSManagedObject *entity=[NSEntityDescription insertNewObjectForEntityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[entity setValue:[NSNumber numberWithInt:x] forKey:@"x"];
NSLog(@"Insert Value %d",x);
[self.managedObjectContext processPendingChanges];
[self.managedObjectContext.undoManager endUndoGrouping];
[self.managedObjectContext.undoManager undoNestedGroup];
NSFetchRequest *fetchRequest=[[NSFetchRequest alloc] init];
NSEntityDescription *entityEntity=[NSEntityDescription entityForName:@"Entity"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entityEntity];
NSArray *result=[self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
for(entity in result) {
NSLog(@"FETCHED ENTITY %d",[[entity valueForKey:@"x"] intValue]);
}
[window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)
这个想法很简单.尝试插入新的Entity对象,撤消它,获取MOC中的所有Entity对象并将其打印出来.如果一切正常,最后应该没有对象.
但是,我得到了这个输出:
[Session started at 2010-02-20 13:41:49 -0800.]
2010-02-20 13:41:51.695 …Run Code Online (Sandbox Code Playgroud) 我需要在 Tkinter小部件中同时创建Control+Z和Shift+ Control+Z功能Text,以便可以撤消和重做事情。
有没有人知道如何做到这一点?
我目前正在MATLAB上开发一个基本的图像处理应用程序.我必须对以前的状态功能实现撤消.我搜索网有uiundo但它只是undos GUI动作.是否有一个简单的撤消命令.谢谢.
我将beta分支合并到主分支中.我推到原点.我现在希望master在本地和远程合并之前就像它一样.
撤消已经推送的合并的一个很好的答案表明
git revert -m 1 commit_hash
Run Code Online (Sandbox Code Playgroud)
如果这确实是要走的路,我该如何确定commit_hash?我没有成功尝试merge-base返回的哈希:
$ git merge-base --all master beta
1f4b949b7ef97abf913ae672e3acd0907abfac1b
$ git revert -m 1 1f4b949b7ef97abf913ae672e3acd0907abfac1b
error: Mainline was specified but commit 1f4b949b7ef97abf913ae672e3acd0907abfac1b is not a merge.
fatal: revert failed
Run Code Online (Sandbox Code Playgroud)
我已经检查了分支的git-log和gitk再现,但是它们很长,我不太清楚我的解释,觉得我应该寻求帮助才能做出更大的混乱.Beta来自v2,它来自master.随着我与主人保持最新的分支机构,我们已经有一些从大师到v2和beta的合并.从beta到Master的方向的合并是我想纠正的错误.
一旦我确定了合并点,如果我发现在合并之后对master进行的任何提交真的应该在beta分支上,那么移动它们的最佳方法是什么?
为什么InterfaceBuilder文件中的FirstResponder缺少redo:连接(在Received Actions列表中)?undo:存在,但redo:没有.我该怎么办呢?
如何撤消应用于一段时间内发生的文件的部分更改.我有以下提交,A并且B'file.txt' 之间发生了意外更改
...--A--B--...
Run Code Online (Sandbox Code Playgroud)
我有一个文件的差异补丁,file.txt-B-A.patch其中恢复所有更改.不过,我只是想撤销某些变化中file.txt,很像一个合并冲突手工采摘的变化.有没有办法在不修改补丁文件的情况下这样做?
我收到了一堆崩溃报告,看起来很像下面这个范围的不同值.有时范围不是0-x,可以说是2-x
特定于应用程序的信息:*由于未捕获的异常终止应用程序\'NSRangeException \',原因:\'* - [NSBigMutableString substringWithRange:]:范围{0,69}超出范围; 字符串长度0 \'
Last Exception Backtrace:
0 CoreFoundation 0x2e879e83 __exceptionPreprocess + 131
1 libobjc.A.dylib 0x38bd66c7 objc_exception_throw + 38
2 CoreFoundation 0x2e879dc5 +[NSException raise:format:] + 112
3 Foundation 0x2f1a1bd1 -[NSString substringWithRange:] + 120
4 UIKit 0x311b2815 -[NSTextStorage(UIKitUndoExtensions) _undoRedoAttributedSubstringFromRange:] + 132
5 UIKit 0x315d9679 -[_UITextUndoOperationTyping undoRedo] + 296
6 Foundation 0x2f296453 -[_NSUndoStack popAndInvoke] + 250
7 Foundation 0x2f2952ef -[NSUndoManager undoNestedGroup] + 454
8 UIKit 0x3127a147 -[UIApplication alertView:clickedButtonAtIndex:] + 142
9 UIKit 0x31216449 -[_UIModalItemsCoordinator _notifyDelegateModalItem:tappedButtonAtIndex:] + 144 …Run Code Online (Sandbox Code Playgroud) 为了提供上下文,我的团队正在浏览器中构建一个富文本编辑器,它需要在会话之间将状态保存到服务器。编辑器的状态显然可以从包含 keydown 事件的文档更新中更改,但我们还应该考虑由撤消/重做事件触发的编辑器阶段的更新。
不幸的是,浏览器没有本机撤消/重做事件(参考)。一项提议的黑客似乎是除了禁用上下文菜单之外,还停止传播映射到撤消键盘快捷键的按键事件。然而,这仍然为用户提供了直接导航到Edit -> Undo应用程序菜单栏的能力,这将直接触发document.execCommand('undo')而不触发事件。因此我们不知道要向服务器发送更新。
这是关于此问题的W3C线程。截至撰写本文时,解决方案似乎仍在制定中......
当另一个浏览器文本编辑器Quill遇到这个问题时,他们的团队似乎建议:“禁用本机撤消/堆栈”,这正是 Facebook 的Draft.js实际所做的。鉴于这似乎是我们正在处理的问题,有谁知道如何禁用/替换浏览器的本机撤消/重做堆栈?显然,这是一个积极的解决方案,但是,在撰写本文时,这似乎是唯一的选择。
与此同时,这个问题的答案可能隐藏在草案代码的某个地方。如果没有人击败我的团队,我会报告选秀的情况。认为至少值得记录这个问题。
cppreference文档https://en.cppreference.com/w/cpp/algorithm/for_each 表示:
- 如果援引为算法的一部分功能的执行引发异常,并ExecutionPolicy是一个三个标准的政策,标准::终止被称为。对于任何其他ExecutionPolicy,该行为都是实现定义的。
我的解释是,这意味着我不能立即使用已for_each传递的函数并期望捕获异常或与之相关的某些信息。
我期望使用异常的原因是,我可以部分撤消(还原)for_each调用中所做的更改。(也许对此有更好的算法)。
但是,偶然地,我发现其历史版本for_each被记录为具有不同的,更有趣的行为:
- 如果策略为std :: parallel_vector_execution_policy,则调用std :: terminate
- 如果policy是std :: sequential_execution_policy或std :: parallel_execution_policy,则该算法将以包含所有未捕获异常的std :: exception_list退出。如果只有一个未捕获的异常,则算法可以将其重新抛出而无需包装在std :: exception_list中。在遇到第一个异常后返回之前,算法将执行多少工作尚未确定。
这似乎暗示terminate着有可能使用异常来代替ing。
那么,为什么std::exception_list要淘汰它呢?是否太有争议,太复杂,太昂贵(内存)?
即使我同意逻辑,但实际上我没有其他选择,因为并行for_each返回void(而不是UnaryFunction返回,这也很令人惊讶)。因此,std::exception_list在我看来,该协议是撤消未完成for_each指令的必要组成部分。
是否有理由期望一些新的自定义策略,例如par_with_failed_list将出现在允许undo输入的位置。
更多上下文:构造失败循环的这种失败模式用于容器。我想实现一个自定义(并行/顺序)uninitialized_value_construct_n,当(任何未排序的)构造失败时,该操作“撤消”(销毁)初始化的对象。
EDIT1:尽管如此,有可能在lambda中将捕获的变量传递给函数参数。此变量可以是共享的并发数据,可以在发生异常时存储异常(作为exception_list)。我想知道这是否已经完成。
EDIT2:我exception_list在HPX中找到了一个实现,
https : //github.com/STEllAR-GROUP/hpx/blob/master/hpx/exception_list.hpp
https://github.com/STEllAR-GROUP/hpx/blob/master /src/exception_list.cpp