- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试学习 Swift,我确定我做错了什么,但我无法弄清楚那可能是什么。
我正在编写一个笔记应用程序来帮助自己跟上这门语言的速度。它具有一个 TableView (由 NSArrayController 填充)。单击 TableView 中的注释会弹出一个显示注释标题和正文的 View Controller 。单击添加按钮创建一个新的笔记管理对象并将其传递给与用于编辑的 View Controller 相同的 View Controller 。
编辑笔记时,用户选择一些文本并按 command-l 可以创建一个标题与所选文本相同的新笔记。
除了 command-l 之外,一切都很好。这种行为非常不寻常,我敢肯定,这是我造成的。
它是这样的:
这是一些代码:
从主( TableView ) Controller :
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
if segue.identifier=="CreateNote" {
let nextViewController = segue.destinationController as! DetailViewController
nextViewController.managedContext=self.managedContext
nextViewController.note = NSEntityDescription.insertNewObjectForEntityForName("Note", inManagedObjectContext: managedContext!) as! Note
}
else if segue.identifier=="EditNote" {
let theSelection = tableView.selectedRow
let theNote = noteArrayController?.arrangedObjects[theSelection] as! Note
let nextViewController = segue.destinationController as! DetailViewController
nextViewController.managedContext=self.managedContext
nextViewController.note = theNote
}
}
从细节 View Controller :
import AppKit
class DetailViewController: NSViewController, KeyNotificationProtocol {
@IBOutlet weak var noteTitle: NSTextField!
@IBOutlet var noteBody: TWTextView!
@IBAction func backButton(sender: AnyObject) {
saveNote()
if historyStack.isNotEmpty() {
note=findNoteByName(historyStack.pop())
loadNote()
}
}
@IBAction func dismissButton(sender: AnyObject) {
saveNote()
self.dismissController(self)
}
var managedContext: NSManagedObjectContext?
var note: Note?
var noteNameToLoad: String?
var historyStack = Stack<String>()
override func viewDidLoad() {
super.viewDidLoad()
loadNote()
noteBody.keyDelegate = self
var requestArray: [KeyRequest] = []
requestArray.append(KeyRequest(theFlags: [NSEventModifierFlags.CommandKeyMask],
theKey: "l",
theTag: "link",
theFunc: self.createLink))
noteBody.keysOfInterest=requestArray
}
override func viewWillDisappear() {
saveNote()
}
func keypressWasReceived(keypress: KeyNotificationData) {
keypress.keypressRequest.funcToCall()
}
func createLink() {
print("create link!")
if(noteBody.selectedRange().length>0) {
saveNote()
if let swRange = noteBody.string?.rangeFromNSRange(noteBody.selectedRange()) {
let selectedText = noteBody.string!.substringWithRange(swRange)
let tempNote=findNoteByName(selectedText)
if(tempNote==nil) {
historyStack.push((note?.title)!)
self.note = (NSEntityDescription.insertNewObjectForEntityForName("Note", inManagedObjectContext: managedContext!) as! Note)
self.note!.title=selectedText
self.note!.attributedBody=NSAttributedString(string: "New note")
loadNote()
}
else {
print("note exists")
}
}
}
}
func saveNote() -> BooleanType {
if (managedContext?.hasChanges != nil) {
self.note?.title=noteTitle.stringValue
self.note?.attributedBody=noteBody.textStorage
var saved = false
do {
try managedContext?.save()
saved = true
}
catch let error as NSError {
print("Error saving \(error)", terminator: "")
}
return saved
}
else {
return true
}
}
func loadNote() {
if self.note?.title==nil {
self.note?.title=""
}
noteTitle.stringValue = (self.note?.title)!
if(self.note?.attributedBody?.length>0) {
noteBody.textStorage?.setAttributedString((self.note?.attributedBody)!)
}
else if(self.note?.body?.characters.count>0) {
noteBody.textStorage?.setAttributedString(NSAttributedString(string: (self.note?.body)!))
}
else {
noteBody.textStorage?.setAttributedString(NSAttributedString(string: ""))
}
}
func findNoteByName(noteName: String) -> Note? {
let freq = NSFetchRequest(entityName: "Note")
freq.predicate = NSPredicate(format: "title == %@", noteName)
var result: [Note]=[]
do {
result = try managedContext?.executeFetchRequest(freq) as! [Note]
}
catch let theError as NSError {
print(theError)
result=[]
}
if result.count>0 {
return result[0]
}
else {
return nil
}
}
}
创建第一个笔记:
按下 command-l 后,第一个音符被保存,第二个音符被创建:
保存第二个笔记(点击完成)后,返回到表格 View ,然后点击第一个:
因此,为了找出发生了什么,我为 managedObjectContext 通知添加了 KVO。我在设置了所有核心数据的 appdelegate 中执行了此操作:
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
NSNotificationCenter.defaultCenter().addObserver(self, selector: "shitHappened:", name: NSManagedObjectContextObjectsDidChangeNotification, object: managedObjectContext)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "shitHappened:", name: NSManagedObjectContextDidSaveNotification, object: managedObjectContext)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "shitHappened:", name: NSManagedObjectContextWillSaveNotification, object: managedObjectContext)
}
func shitHappened(sender: AnyObject) {
print("-- something happened with core data --")
print(sender)
}
监控我的观察者生成的输出,我没有看到第一个笔记被更新和保存,以至于正文被设置为第二个!这是其中的数据。在此日志数据的最后,有一条通知说第一个注释已被修改。在哪里?!
-- something happened with core data --
NSConcreteNotification 0x608000045c10 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
inserted = "{(\n <testwiki.Note: 0x6100000a8fa0> (entity: Note; id: 0x610000020b40 <x-coredata:///Note/tBCC61422-BDB8-44EB-A1A0-D32126C892354> ; data: {\n attributedBody = nil;\n body = nil;\n title = \"\";\n})\n)}";
managedObjectContext = "<NSManagedObjectContext: 0x6180001c01e0>";
}}
create link!
-- something happened with core data --
NSConcreteNotification 0x61000005af40 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
managedObjectContext = "<NSManagedObjectContext: 0x6180001c01e0>";
updated = "{(\n <testwiki.Note: 0x6100000a8fa0> (entity: Note; id: 0x610000020b40 <x-coredata:///Note/tBCC61422-BDB8-44EB-A1A0-D32126C892354> ; data: {\n attributedBody = \"This is the first, not the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = \"The First Note\";\n})\n)}";
}}
-- something happened with core data --
NSConcreteNotification 0x61000004dc50 {name = NSManagingContextWillSaveChangesNotification; object = <NSManagedObjectContext: 0x6180001c01e0>}
-- something happened with core data --
NSConcreteNotification 0x61000024c870 {name = NSManagingContextDidSaveChangesNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
inserted = "{(\n <testwiki.Note: 0x6100000a8fa0> (entity: Note; id: 0x610000228e00 <x-coredata://18C6EA07-F369-4289-B333-53326C2B9DFE/Note/p226> ; data: {\n attributedBody = \"This is the first, not the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = \"The First Note\";\n})\n)}";
updated = "{(\n)}";
}}
loadNote
Optional("second")
Optional(New note{
})
-- something happened with core data --
NSConcreteNotification 0x610000053a10 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
inserted = "{(\n <testwiki.Note: 0x6100000a9a80> (entity: Note; id: 0x6100002298c0 <x-coredata:///Note/tBCC61422-BDB8-44EB-A1A0-D32126C892355> ; data: {\n attributedBody = \"New note{\\n}\";\n body = nil;\n title = second;\n})\n)}";
managedObjectContext = "<NSManagedObjectContext: 0x6180001c01e0>";
}}
-- something happened with core data --
NSConcreteNotification 0x61800005cbc0 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
managedObjectContext = "<NSManagedObjectContext: 0x6180001c01e0>";
updated = "{(\n <testwiki.Note: 0x6100000a9a80> (entity: Note; id: 0x6100002298c0 <x-coredata:///Note/tBCC61422-BDB8-44EB-A1A0-D32126C892355> ; data: {\n attributedBody = \"This is the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = second;\n})\n)}";
}}
-- something happened with core data --
NSConcreteNotification 0x618000240d50 {name = NSManagingContextWillSaveChangesNotification; object = <NSManagedObjectContext: 0x6180001c01e0>}
-- something happened with core data --
NSConcreteNotification 0x61800005d970 {name = NSManagingContextDidSaveChangesNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
inserted = "{(\n <testwiki.Note: 0x6100000a9a80> (entity: Note; id: 0x61800003ac20 <x-coredata://18C6EA07-F369-4289-B333-53326C2B9DFE/Note/p227> ; data: {\n attributedBody = \"This is the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = second;\n})\n)}";
updated = "{(\n)}";
}}
-- something happened with core data --
NSConcreteNotification 0x618000242310 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
managedObjectContext = "<NSManagedObjectContext: 0x6180001c01e0>";
updated = "{(\n <testwiki.Note: 0x6100000a9a80> (entity: Note; id: 0x61800003ac20 <x-coredata://18C6EA07-F369-4289-B333-53326C2B9DFE/Note/p227> ; data: {\n attributedBody = \"This is the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = second;\n})\n)}";
}}
-- something happened with core data --
NSConcreteNotification 0x618000242f40 {name = NSManagingContextWillSaveChangesNotification; object = <NSManagedObjectContext: 0x6180001c01e0>}
-- something happened with core data --
NSConcreteNotification 0x608000046240 {name = NSManagingContextDidSaveChangesNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
inserted = "{(\n)}";
updated = "{(\n <testwiki.Note: 0x6100000a9a80> (entity: Note; id: 0x61800003ac20 <x-coredata://18C6EA07-F369-4289-B333-53326C2B9DFE/Note/p227> ; data: {\n attributedBody = \"This is the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = second;\n})\n)}";
}}
about to segue to editNote
with title
Optional("The First Note")
Optional(This is the second.{
NSFont = "\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\"";
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n 28L,\n 56L,\n 84L,\n 112L,\n 140L,\n 168L,\n 196L,\n 224L,\n 252L,\n 280L,\n 308L,\n 336L\n), DefaultTabInterval 0, Blocks (\n), Lists (\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0";
})
------------------------
loadNote
Optional("The First Note")
Optional(This is the second.{
NSFont = "\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\"";
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n 28L,\n 56L,\n 84L,\n 112L,\n 140L,\n 168L,\n 196L,\n 224L,\n 252L,\n 280L,\n 308L,\n 336L\n), DefaultTabInterval 0, Blocks (\n), Lists (\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0";
})
-- something happened with core data --
NSConcreteNotification 0x618000241aa0 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x6180001c01e0>; userInfo = {
managedObjectContext = "<NSManagedObjectContext: 0x6180001c01e0>";
updated = "{(\n <testwiki.Note: 0x6100000a8fa0> (entity: Note; id: 0x610000228e00 <x-coredata://18C6EA07-F369-4289-B333-53326C2B9DFE/Note/p226> ; data: {\n attributedBody = \"This is the second.{\\n NSFont = \\\"\\\\\\\"Helvetica 12.00 pt. P [] (0x610000247e90) fobj=0x101b11ca0, spc=3.33\\\\\\\"\\\";\\n NSParagraphStyle = \\\"Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\\\\n 28L,\\\\n 56L,\\\\n 84L,\\\\n 112L,\\\\n 140L,\\\\n 168L,\\\\n 196L,\\\\n 224L,\\\\n 252L,\\\\n 280L,\\\\n 308L,\\\\n 336L\\\\n), DefaultTabInterval 0, Blocks (\\\\n), Lists (\\\\n), BaseWritingDirection -1, HyphenationFactor 0, TighteningForTruncation YES, HeaderLevel 0\\\";\\n}\";\n body = nil;\n title = \"The First Note\";\n})\n)}";
}}
其他注意事项:我在子类 NSTextView 中观察 command-l 并重写了 keyDown 函数。
编辑:我忘记指出,如果我创建一长串音符,使用 command-l 从一个音符转到下一个音符,当我回头查看时,该音符链中的每个音符都将具有相同的音符主体他们。
最佳答案
所有的 attributedBodies 都指向同一个 textStorage。
改变
self.note?.attributedBody=noteBody.textStorage
到
self.note?.attributedBody = NSAttributedString(attributedString: noteBody.textStorage!)
关于macos - 不寻常的核心数据行为 - 保存一个对象会影响另一个对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181372/
我想创建一个基于 jQuery 的非常简单的 html 编辑器(不是所见即所得)。 我的问题是如何制作 textarea或 div可能 在上面写一些文字 然后样式即标签(例如 some stuff 将
根据文档 isset 条款“测试此项目中是否已设置给定属性”。我不明白设置属性时 isset 返回 true 还是 false 在下面的代码片段中,当 env.JAVA_HOME 未设置时,java.
我正在尝试取消映射 o这是执行 :only 的默认命令( :help :only ),所以我尝试的第一件事是: nmap o 这种作品,除非我按 ,等待超过timeoutlen ms 然后按 o
我有以下型号: class MetaData(models.Model): created_at = models.DateTimeField(auto_now_add=True, auto_
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我有一个关于 C 代码的问题。 #include void foo(void){ int a; printf("%d\n",a); } void bar(void){
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
我有一个命令 Get-Testdata从不同来源检索测试数据并将这些数据存储到 PSObject以不同的值作为属性。然后将对象总数存储为数组,以便于操作、排序、计算等。 我的问题是我希望能够将这些数据
我正在使用 epoll 将大消息写入使用 HTTP 协议(protocol)的服务器。 fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EA
这对我来说听起来很奇怪: $test_1 = 'string'; $test_2 = '0'; var_dump(intval($test_1)); // Output: int 0 var_dump
这个问题在这里已经有了答案: Java: Integer equals vs. == (7 个回答) 7年前关闭。 请您解释以下行为。 public class EqAndRef { publ
Drupal 的行为到底是什么? 它为模块开发人员提供什么类型的服务层? 它映射到 jQuery.ready 的关系类型是什么? 最佳答案 长版:Drupal.behaviors 不仅仅是 jQuer
以下代码: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0
人们可以将项目添加到数据库中。我让他们选择在此时添加它,或手动选择日期。 因此我得到了这个 HTML 结构。 (请注意,我将日期和时间选择器妥协为只有一行文本) Selec
创建了一个数据框: simpleDF is.na(simpleDF$vals) [1] TRUE TRUE FALSE > is.nan(simpleDF$vals) [1] FALSE TRU
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
我想知道以下情况下 JVM 的行为是什么: JVM 最小堆大小 = 500MB JVM 最大堆大小 = 2GB 操作系统有 1GB 内存 JVM启动后,程序运行一段时间后,使用内存超过1GB。我想知道
我们正在使用 spikeearrest 策略,但我们不了解其工作原理。峰值逮捕配置如下: 5pm 阅读文档,我们了解到,如果我们在一分钟内调用此流超过 5 次,则该策略将在第 5 次之后
我正在使用 cURL 发送 POST 请求: curl http://tarvos.local:8080/partial_Users/2 -d '{currentPage : 1, firstID :
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
我是一名优秀的程序员,十分优秀!