标签: cocoa-bindings

为什么我的NSTableView中的图像逐渐淡出?

首先,有一个NSArrayController("服务器"),其内容是"服务器"对象的数组.

我也有NSTableView一个专栏.该列绑定到Server的"arrangeObjects.status"属性.

我使用自定义NSValueConverter,以使该状态成列的图像dataCell这是一个NSImageCell.

我不明白的是为什么列中显示的图像是正确的,但一直消失.只是为了测试,我在表格视图外面有相同的图像进行比较,它绘制得很好.图像中的颜色不是半透明的.

NSImageCell绘制图像是否褪色?我可以在IB中配置哪些东西将它们完全饱和?

cocoa nstableview nstablecolumn cocoa-bindings nsimagecell

7
推荐指数
1
解决办法
822
查看次数

每行使用不同的单元格(和数据类型)实现NSOutlineView/NSTableView

我想知道如何实现像Xcode 3用于构建配置的大纲视图:

替代文字http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

当使用带有绑定的NSOutlineView/NSTableView和NSTreeController/NSArrayController时,由于显而易见的原因,视图的列会分配给而不是单个单元格的绑定.如果列中的每一行都使用相同的单元格,那么它就是小菜一碟.但是,如果每一行(可能)使用自己的单元格类型(并且可能使用它自己的绑定集合),那么事情就会变得质朴.

查看屏幕截图,可以清楚地看到文本域单元格只需要一个"值"绑定.虽然弹出按钮单元需要至少一个用于" 内容 ",一个用于" contentValues ",而最后但不是至少一个用于" selectedIndex/selectedObject/selectedValue ".复选框单元格需要绑定" value "和(可能)一个用于" title ".

如何用尽可能干净(和小)的代码来实现这一目标?
(或者有人可能会问: Apple 如何做到这一点?)

...

这是我到目前为止所尝试的内容:
我通过[outlineView:dataCellForTableColumn:item:]提供适当的(复制的)单元格,并将它们绑定到各个数据模型(来自[item representObject]).我知道大纲视图中显示的确切数据量(<500行),因此每行一个单元格不应该是内存问题太多,不是吗?我通过绑定得到了正确显示数据(耶!)但是我无法更改任何值.O_o显然,价值变化根本不会通过数据模型.是否还有一个简单的[checkboxCell bind:@"value"toObject:rowModel withKeyPath:@"value"options:nil]?(因为这似乎足以越来越值,但不是相应地设置它们.)

我找不到有关此主题的任何信息.每列使用自定义单元格的大量信息和提示,但没有在"每行"基础上使用它们的信息和提示.:(
这会为Cocoa教程做一些很棒的东西,不是吗?;)

cocoa nsoutlineview nstableview custom-cell cocoa-bindings

7
推荐指数
1
解决办法
3270
查看次数

启动基于Cocoa文档的应用程序首先显示选择窗口

这似乎应该很容易但我必须遗漏一些东西.我有一个基于文档的应用程序.我还构建了一个新的XIB,它有一个NSTableView和三个按钮,我打算显示以前的文件列表.我希望在应用程序首次启动时显示此XIB而不是文档窗口.一旦用户选择旧文件或点击"新建"按钮,我希望然后转到文档窗口.这是非常常见的,我经常看到使用过.

在我试图实现这一点的过程中,我修改了project-info.plist文件,并将主要NIB文件基本名称从MyDocument更改为我的选择XIB名称.这会导致应用程序显示"选择"窗口而不是"MyDocument"窗口.到目前为止似乎没有问题.

在我的选择窗口中,我已经为此XIB设置了我的表视图和一个数组控制器以及一个自定义窗口控制器.我已将文件所有者设置为新的窗口控制器,并将窗口控制器的窗口属性绑定到窗口,将Window的委托属性绑定到文件所有者以及"选择","取消"和"新建"按钮.NSApplication没有任何限制.但奇怪的是,当我运行这个应用程序时,似乎想要将这些控制器连接到NSApplication并出现错误(对于其他两个按钮也是如此):

无法将动作selectButton:连接到类NSApplication的目标

它还显示一个错误,即NSApplication不符合Key-Value标准,用于保存对我的数组的引用的插座.阵列控制器,窗口和按钮不绑定到NSApplication,而是绑定到新的Window Controller.我原本以为如果有任何问题就不会提到NSApplication而是提到控制器绑定的窗口控制器.

谁知道这里发生了什么?这是一个Target-Action问题,因为我将"主要NIB文件库名称"从"主菜单"更改为"选择"?如果我不应该改变这个,那么我怎样才能让Cocoa允许我在显示文档窗口之前显示选择屏幕?

任何帮助是极大的赞赏.抢

cocoa xib document-based cocoa-bindings

7
推荐指数
1
解决办法
2149
查看次数

将图像绑定到NSArrayController的NSPopupbutton

这个问题是链接的扩展(链接中
的问题主要是目标,将NSPopupbutton绑定到NSArrayController)

我有一个Person有类属性NSString *nameNSImage *avatar
我都必须表现弹出按钮人员的所有名称作为下面的图片中看到的. 在此输入图像描述

但是现在,随着要求的变化,我也需要展示人的化身.
如何使用Cocoa绑定将人的头像绑定到NSPopup按钮,使其看起来像上面图像中的michael(最后一个菜单选项)


注意:Michael已使用以下代码暂时添加进行演示:

person.title = @"Michael";
person.image = [NSImage imageNamed:@"avatar.png"];
[_popupButton.menu addItem:person];
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c appkit cocoa-bindings

7
推荐指数
1
解决办法
902
查看次数

如何从NSCollectionViewItem中的视图获取representObject?

我有一个在我的每个CollectionView项目中使用的视图.我从我的视图中有一个关于CollectionViewItem的IBOutlet,我已经将它连接到Interface Builder中.我想在我的视图代码中访问来自representObject(它是一个Core Data对象)的值.这是我正在尝试做的一个示例 - 访问representObject的序列值:

在.h文件中:

IBOutlet NSCollectionViewItem *item; // Connected in IB
Run Code Online (Sandbox Code Playgroud)

在.m文件中

NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
Run Code Online (Sandbox Code Playgroud)

我知道seq是填充的,因为我使用representObject.seq键路径将它绑定到IB中CollectionViewItem视图中的标签,并且可以正常工作.

知道为什么当我尝试在视图的代码中访问seq的值时它返回null吗?

cocoa objective-c cocoa-bindings nscollectionview

6
推荐指数
1
解决办法
4048
查看次数

NSManagedObject不反映后台线程NSManagedObjectContextDidSaveNotification后的更改

我遇到问题,NSManagedObject没有反映在后台线程保存上下文后对持久存储所做的更改.

安装程序

在一个简单的测试应用程序中,我有一个窗口列出了我的核心数据持久存储中的所有对象,一个用于过滤结果的搜索框和一个用于显示所选项目名称的文本字段,并允许更改名称.

绑定如下:

ArrayController --> AppDelegate --> ManagedObjectContext
TableView Col 1 --> ArrayController --> values --> arrangedObjects.widgetName
TableView Col 2 --> ArrayController --> values --> arrangedObjects.uid

SearchField --> ArrayController --> predicate --> filterPredicate

TextField --> ArrayController --> value --> selection.widgetName

我还有一个按钮,用于启动从Web服务器获取数据的后台(NSOperation).

过程

当用户单击刷新按钮时,NSOperation将启动并异步抓取窗口小部件,解析响应,检查要删除的不在响应中的本地窗口小部件,要添加的新窗口小部件未存储在本地和现有本地应使用从服务器检索的数据更新的小部件.

处理完成后,将使用以下方式通知主要上下文:

[mainContext performSelectorOnMainThread:
       @selector(mergeChangesFromContextDidSaveNotification:) 
                              withObject:notification 
                           waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

我在主控制器中有一个观察者进行测试,显示变化经过了很好,主控制器得到了通知.

问题

如果我使用文本字段对选定对象进行更改,则在保存后台线程上的数据时,UI中的对象不会更新以反映这些更改(即,它不会覆盖具有更改的UI)服务器).

例如,给出以下三个小部件和ID:

Test Name 1 | ID 123
Test Name 2 | ID 234
Test Name 3 | ID 345

如果我的UI更改名称Test Name 2Renamed 2我有以下几点: …

objective-c background-process nsarraycontroller cocoa-bindings nsmanagedobjectcontext

6
推荐指数
1
解决办法
2083
查看次数

NSArrayController上的SelectionIndexes只返回一个值

我有一个NSCollectionView,其内容由NSArrayController处理.NSCollectionView是可选择的,我需要检索所选元素的列表.我正在尝试观察NSArrayController"selectionIndexes"的关键属性,但它只返回我总是CollectionView中第一个元素的值而不是所选项.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
        //True if in the array controller of the collection view really exists at least a selected object
        if([[arrayController selectedObjects] count] > 0)
        {
            NSLog(@"Selected objects: %@", [arrayController selectedObjects]);
        }
        else
        {
            NSLog(@"Observer called but no objects where selected.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我永远不会调用这个方法,如果我手动调用NSLog(@"Selected objects:%@",[arrayController selectedObjects])我得到这个

结果总是这样的

结束更新

2011-07-05 20:44:45.711 collectionView2[2153:903] Selected objects 1: (
    "<Hormiga: 0x10013e330>"
)
Run Code Online (Sandbox Code Playgroud)

我想我已经做了一些错误的NSArrayController与NSCollectionView绑定.可能是我的错?告诉我如果你想要更多信息,我甚至可以在你需要的时候以邮政编码发布整个程序.

更新2

这是我在我的控制器中用来观察arrayController"selectionIndexes"键的代码.

[arrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];
Run Code Online (Sandbox Code Playgroud)

更新3

其中一个问题是修复的,我忘了在NSArrayController和NSCollectionView之间设置相对于键"selectionIndexes"的绑定.现在我可以手动检索selectedObject列表及其正确! …

macos cocoa objective-c key-value-observing cocoa-bindings

6
推荐指数
1
解决办法
4548
查看次数

如何为NSPopUpButton设置绑定

我想将NSPopUpButton的选择绑定到其中一个预定义的值.为了使它更简单,想象一个博客的应用程序:我必须BlogPostCategory实体(核心数据,但它并不重要),每个BlogPost对象都有一个链接到一个Category对象(通过category属性).

我想让用户通过NSPopUpButton更改类别,所以在我的XIB中,我有NSArrayController,它包含所有可能的类别,我将按钮的内容值绑定到:

  • 绑定到:categoriesArrayController
  • 控制器键:arrangeObjects
  • 型号键:标题

这个很好的填充弹出所有类别的标题.我也可以将Selected Object绑定到:

  • 绑定到:blogObjectController(或直接Blog对象)
  • 控制器键:选择
  • 型号关键:类别

这样可以在弹出窗口中选择正确的类别,但更改选择不会更改提交博客文章的类别,而是将帖子类别的标题更改为所选值.

鉴于上述绑定,这实际上是有意义的,所以我的下一步是将弹出窗口内容值的绑定更改为仅仅为arrangeObjects(无模型键),类似选择的对象.这项工作和更改选择确实category将博客文章更改为另一个.它不会在弹出菜单中显示类别标题,而是显示description类别(在核心数据中以类似的结尾)<Category 0x1002b6990> (entity: Category; id: .......).

这也有道理,所以我介绍了自定义NSValueTransformer(不可逆).这修复了弹出菜单中的项目描述,但随后选择不起作用.我也尝试在选定的对象绑定上使用变换器,但这只是完全禁用我的弹出窗口(可能需要反向变换,但这会使变换器大大复杂化).

我错过了一些明显的东西 - 这是否可以完全用绑定来实现,而不在控制器层上引入额外的代码?

欢迎任何欢迎!

PS:希望以上文字有道理:)

cocoa selection cocoa-bindings nspopupbutton

6
推荐指数
1
解决办法
5441
查看次数

NSImageView和NSImageCell之间有什么关系?

似乎如果我创建一个NSImageView代码,如果NSImageView图像变得比图像本身大,则无法按比例自动缩放图像.(一个奇怪的遗漏)

另一方面,如果我NSImageView在IB中创建它,它似乎以某种方式附加NSImageCellNSImageView并且NSImageCell有一个选项按比例上下缩放,这就是我想要的.

但在IB,我似乎无法理解之间的关系NSImageViewNSImageCell.我无法删除NSImageCellNSImageView和我没有看到在绑定或其他地方的连接.

如何NSImageCell在创建NSImageView代码时获得功能?

对不起,如果这是显而易见的,但我已经习惯了UIImageViews,他们肯定不同于NSImageView.

谢谢.

cocoa interface-builder cocoa-bindings nsimageview

6
推荐指数
1
解决办法
1160
查看次数

使用 Swift 中的绑定以编程方式创建基于视图的 NSTableView

我正在阅读 Swift 中的 Cocoa 一书,但我被困在关于 Bindings 的一章中。这本书使用 nib 文件,但我想以编程方式完成所有工作(因为我加入了一个不使用 nib 的团队)。该项目是创建视图基于表2列和表中的内容被绑定到arrangedObjects阵列控制器的。数组控制器的内容绑定到一组 Employee 对象(Employee 有 2 个属性,即姓名和薪水)。

我能够像下面那样以编程方式创建表格(一个滚动视图,一个表格视图,2 个表格列):

let tableWidth = windowWidth! * 0.6
let tableHeight = windowHeight! * 0.8

scrollView = NSScrollView(frame: NSRect(x: windowWidth!*0.05, y: windowHeight!*0.08, width: tableWidth, height: tableHeight))

employeeTable = NSTableView(frame: NSRect(x: 0, y: 0, width: tableWidth, height: tableHeight))
employeeTable?.bind("content", toObject: (self.arrayController)!, withKeyPath: "arrangedObjects", options: nil)

nameColumn = NSTableColumn(identifier: "name column")
nameColumn?.width = tableWidth * 0.4
nameColumn?.headerCell.title = "Name"

raiseColumn = NSTableColumn(identifier: "raise column")
raiseColumn?.width …
Run Code Online (Sandbox Code Playgroud)

nstableview nstablecolumn cocoa-bindings swift

6
推荐指数
1
解决办法
4802
查看次数