我有NSCollectionView
一个小问题但很关键的例外.获取并突出显示集合中的所选项目.
在Snow Leopard之前我已经完成了所有这些工作,但是有些东西似乎发生了变化,我无法完全按照它进行操作,所以我把我的NSCollectionView
右手放回基本测试并按照Apple的文档创建了一个NSCollectionView:
根据快速入门指南,集合视图可以正常工作.但是,本指南不讨论除了以外的选择"There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
.
以此为例,我进入了将Array Controller NSCollectionView
与控制器键绑定的下一步selectionIndexes
,认为这将绑定我NSCollectionView
在阵列控制器之间做出的任何选择,从而触发KVO通知.我还设置了NSCollectionView
在IB中可选择.
似乎没有选择委托,NSCollectionView
并且与大多数Cocoa UI视图不同,似乎没有默认的选定突出显示.
所以我的问题实际上归结为一个相关的问题,但有两个截然不同的问题.
NSCollectionView
编程指南似乎很少,而且大多数通过Google搜索似乎都会提升Snow Leopard之前的实现,或者在单独的XIB文件中使用该视图.
对于后者(视图的单独XIB文件),我不明白为什么这应该是先决条件,否则我会怀疑Apple不会将视图包含在与集合视图项相同的包中.
我知道这将是一个"无法看到木头为树"的问题 - 所以我已经为"doh!"做好了准备.时刻.
像往常一样,任何和所有帮助非常感谢.
更新1
好的,所以我想找到所选的项目,但尚未确定突出显示.有兴趣计算所选项目(假设您正在关注Apple指南):
在控制器中(在我的测试用例中,App Delegate)我添加了以下内容:
在awakeFromNib中
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
Run Code Online (Sandbox Code Playgroud)
新方法
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
if([[personArrayController …
Run Code Online (Sandbox Code Playgroud) cocoa objective-c nsview nscollectionview nscollectionviewitem
我在QuickLook
从一个表中实现功能时遇到一些问题NSView
.有限的文档QuickLook
确实没有任何帮助.
在阅读了Apple Docs(主要面向自定义生成器和插件)后,我最终查看了QuickLookDownloader示例代码.这段代码基于一个基于文档的应用程序,但对我来说似乎是正确的方法(毕竟它是Apple的代码,它确实在他们的项目中工作).
在我的实现中QuickLook panel
,我可以让它显示得很好,我可以轻松地解雇它.但是,面板本身从不在我的内部调用委托方法NSViewController
.结果我甚至都没有显示对象,只是写着"没有选择项目".我很难过.
我试着打电话给setDelegate
,但如果我继续沿着那条路走下去,就会被警告即将到来的厄运......
[QL] QLError(): - [QLPreviewPanel setDelegate:]在面板没有控制器的情况下调用 - 修复此问题,否则很快就会引发此问题.请参阅QLPreviewPanel.h中的注释-acceptsPreviewPanelControl:/ - beginPreviewPanelControl:/ - endPreviewPanelControl:.
然后在尝试响应其中一个委托方法时,使用dealloc发生厄运.
是的,我确实阅读了标题,确认我应该在赢得小组后设置代表(参见下面的代码).
所以这里是我的代码,它几乎与示例代码匹配,但a)我获取数据(我从中获取NSArrayController
)和b)我从中获取预览项目(我直接来自我的模型对象) - 或者无论如何)
@interface MyViewController : NSViewController
<QLPreviewPanelDataSource, QLPreviewPanelDelegate> {
QLPreviewPanel * previewPanel;
NSArrayController * myArrayController;
NSTableView * myTable;
// [...] Other instance vars
}
@implementation MyViewController
// [...] all the other methods, init, dealloc etc...
-(IBAction)togglePreviewPanel:(id)previewPanel {
if ([QLPreviewPanel sharedPreviewPanelExists] …
Run Code Online (Sandbox Code Playgroud) 我有一位同事今天来找我,问题是他如何加载或查看交换一个documentView
,NSScrollView
以便加载的视图看起来固定在左上角而不是底部角落.
尽管在Apple,StackOverflow和其他各个地方阅读了文档,但他花了一段时间在网上搜索并且没有解决方案.
这是一件一件的问题:
在Interface Builder中,拖入NSScrollView
项目.同样在Interface Builder中,将两个自定义视图拖到项目中,并添加一些文本字段,按钮等.
使用以下IBOutlet
s 创建一个控制器类(例如myController):
IBOutlet NSScrollView * myScrollView
IBOutlet NSView * myCustomView1
IBOutlet NSView * myCustomView2
将插座连接到Interface Builder中的控件.
创建一个NSView
子类来翻转documentView
:
@implementation myFlippedView
-(id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
-(void)drawRect:(NSRect)dirtyRect {
// Drawing code here.
}
-(BOOL)isFlipped {
return YES;
}
Run Code Online (Sandbox Code Playgroud)
选择documentView
的NSScrollView
界面生成器,并使其的子类myFlippedView
.在Interface Builder中,您将选择NSScrollView,然后再次单击它以进入documentView
,或更改IB库以显示树视图并选择子视图NSScrollView
.
在myController …
我们最近更新了我们的应用程序,以便使用带有新证书的SHA-256代码签名.程序集是使用Sign the assembly
Visual Studio 2015中的选项签名的强名称.Visual Studio中的post build事件运行两个signtool.exe
进程以在SHA-256和旧SHA-1证书中签名:
call "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe"
sign /f "<mystrongName.pfx>" /p "<password>" /t
<timestampURL> "$(TargetPath)"
call "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe"
sign /f "<mystrongName.pfx>" /p "<password>" /fd sha256 /tr
<timestampURL> /td sha256 /as /v "$(TargetPath)"
Run Code Online (Sandbox Code Playgroud)
最后,我们使用Advanced Installer作为安装包装程序,Digital Signature
并且根据.exe签名使用证书和时间戳在页面上进行代码签名.
最终的安装文件将按照您的预期在Internet连接的Windows计算机上安装和运行.安装时,您可以通过setup.exe和运行时的属性看到证书已分配且有效,以及证书链.此外,Windows将应用程序识别为来自受信任的来源,并显示相应的已验证发布者详细信息.
我们的客户群主要是全球100家公司,大部分部署将在气隙网络中进行.在此环境中的第二次更新部署中,无法验证证书,导致安装程序无法完成.
这是有道理的,因为Windows(2012服务器R2)计算机与Internet隔离,并且由于公司政策的原因,已经Turn off Automatic Root Certificates
设置为Enabled
.此设置可以Computer Configuration -> Administrative Templates -> System -> Internet Communication Management -> Internet Communication Settings
在MMC应用程序的文件夹中找到(您需要安装证书插件).
在我们的本地测试台上进行测试时,如果上述注册表设置为默认值(Disabled
),即使未连接到Internet的计算机也会从安装实用程序安装证书.我们可以通过更改策略设置来匹配客户的(Enabled
)来复制问题. …
经过大量搜索后,在尝试执行文件复制并显示相对于已复制文件数量的进度指示器时似乎存在常见问题.在花了一些相当长的时间试图解决这个问题后,我发现自己再次受到StackOverflow众神的支配:-) - 希望有一天我会成为那些可以帮助新手的人之一!
我试图获得一个进度条来显示复制过程的状态,一旦复制过程完成,调用Cocoa方法.挑战 - 我需要使用文件管理器碳调用,因为NSFileManager不能提供我所需的全部功能.
我开始试图利用Matt Long的网站Cocoa Is My Girlfriend上的代码.代码让我有了一些很好的距离.我设法让文件复制进度正常工作.栏更新和(在Apple文档中进行一些额外搜索)我发现如何判断文件复制过程是否已完成...
if (stage == kFSOperationStageComplete)
但是,我有一个最后一个障碍,比我现在的飞跃大一点.我不知道如何将对象引用传递给回调,我不知道如何在回调完成后调用Cocoa方法.这是我的碳 - >可可 - >碳理解的限制.其中一条评论在博客上说
"不是通过静态指针访问进度指示器,而是可以使用FSFileOperationClientContext结构的void*info字段,并传递AppDelegate或进度指示器本身."
这主意听起来很不错.不知道该怎么做.为了其他人似乎遇到这个问题并且来自非碳背景,主要基于Matt的例子中的代码,这里有一些简化的代码作为问题的一个例子......
在正常的可可方法中:
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
FSFileOperationRef fileOp = FSFileOperationCreate(kCFAllocatorDefault);
OSStatus status = FSFileOperationScheduleWithRunLoop(fileOp,
runLoop, kCFRunLoopDefaultMode);
if (status) {
NSLog(@"Failed to schedule operation with run loop: %@", status);
return NO;
}
// Create a filesystem ref structure for the source and destination and
// populate them with their respective paths from our NSTextFields.
FSRef source;
FSRef destination; …
Run Code Online (Sandbox Code Playgroud) cocoa macos-carbon objective-c nsfilemanager nsprogressindicator
我目前有一个NSView
绘制网格图案(基本上是水平和垂直线的指南),其想法是用户可以更改网格的间距和网格的颜色.
网格的目的是在排列对象时充当用户的指导.除了一个例外,一切正常.当我NSWindow
通过拖动调整大小手柄调整大小时,如果我的网格间距特别小(比如10像素).阻力调整大小变得昏昏欲睡.
我drawRect
的网格代码如下:
-(void)drawRect:(NSRect)dirtyRect {
NSRect thisViewSize = [self bounds];
// Set the line color
[[NSColor colorWithDeviceRed:0
green:(255/255.0)
blue:(255/255.0)
alpha:1] set];
// Draw the vertical lines first
NSBezierPath * verticalLinePath = [NSBezierPath bezierPath];
int gridWidth = thisViewSize.size.width;
int gridHeight = thisViewSize.size.height;
int i;
while (i < gridWidth)
{
i = i + [self currentSpacing];
NSPoint startPoint = {i,0};
NSPoint endPoint = {i, gridHeight};
[verticalLinePath setLineWidth:1];
[verticalLinePath moveToPoint:startPoint];
[verticalLinePath lineToPoint:endPoint];
[verticalLinePath stroke];
}
// Draw …
Run Code Online (Sandbox Code Playgroud) 我遇到问题,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 2
到Renamed 2
我有以下几点: …
objective-c background-process nsarraycontroller cocoa-bindings nsmanagedobjectcontext
我已经碰到了众所周知的问题,试图弄清楚如何使用桌面应用程序中的异步NSURLConnection返回的数据来填充NSImage(不是iPhone应用程序!!).
情况就是这样.
我有一个使用自定义单元格的表.在每个自定义单元格中都是从Web服务器中提取的NSImage.为了填充图像,我可以轻松地执行同步请求:
myThumbnail = [[NSImage alloc] initWithContentsOfFile:myFilePath];
Run Code Online (Sandbox Code Playgroud)
这个问题是表格会阻塞,直到填充图像(显然是因为它是同步请求).在一张大桌子上,这使得滚动难以忍受,但即使只是在第一次运行时填充图像,如果它们具有任何显着大小,也可能是乏味的.
所以我创建了一个异步请求类,它将根据Apple的文档检索自己的线程中的数据.没问题.我可以看到数据被拉动和填充(通过我的日志文件).
我遇到的问题是,一旦我有数据,我需要回调到我的调用类(自定义表视图).
我的印象是我可以做这样的事情,但它不起作用,因为(我假设)我的调用类真正需要的是一个委托:
NSImage * myIMage;
myImage = [myConnectionClass getMyImageMethod];
Run Code Online (Sandbox Code Playgroud)
在我的连接类委托中,我可以看到我获取数据,我只是没有看到如何将它传递回调用类.我的connectionDidFinishLoading
方法直接来自Apple文档:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// do something with the data
// receivedData is declared as a method instance elsewhere
NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
// release the connection, and the data object
[connection release];
[receivedData release];
}
Run Code Online (Sandbox Code Playgroud)
我希望这是一个简单的问题需要解决,但我担心我对这个问题的知识极限,尽管有一些严肃的谷歌搜索并尝试了许多不同的推荐方法,但我仍在努力想出一个解决方案.
最终,我将为我的应用程序提供一个复杂的缓存机制,其中表格视图在外出之前检查本地计算机上的图像并从服务器获取它们,并且可能有一个进度指示器,直到检索到图像.现在,如果图像使用同步过程足够大,那么即使是局部图像填充也会很慢.
任何和所有的帮助将非常感谢.
解决方案更新
如果其他人需要一个类似的解决方案,感谢Ben的帮助,这就是我提出的(通常修改为发布当然).请记住,我还实现了图像的自定义缓存,并使我的图像加载类足够通用,以供我的应用程序中的各个地方用于调用图像.
在我的调用方法中,在我的情况下是表中的自定义单元格...
ImageLoaderClass * myLoader = [[[ImageLoaderClass alloc] init] autorelease];
[myLoader fetchImageWithURL:@"/my/thumbnail/path/with/filename.png"
forMethod:@"myUniqueRef" …
Run Code Online (Sandbox Code Playgroud) Objective-C是否评估一个if... else if...
块上的每个语句,或者它是否会对每个语句进行评估,然后在找到真实条件时跳过剩余的评估?
这更像是一个与绩效相关的实用问题而不是其他任何问题.
是的,我知道if块本身的内容没有被执行,但我指的是得到评估的实际语句.
例
if ([condition A] == test) {
// Do something
} else if ([condition B] == test) {
// Do something
} else if ([condition C] == test) {
// Do something
} else {
// Do something because all other tests failed
}
Run Code Online (Sandbox Code Playgroud)
那么......如果条件A为真,那么条件B和C是否还要进行评估?
如果他们这样做,那么使用switch语句是否以相同的方式执行,或者一个switch只测试每个条件,然后由于中断而退出评估?
我的理解是,在一个if... else if...
块上,每个条件都被评估,因此使用一个开关或嵌套如果(呃 - 不喜欢那里的想法)对大量数据的大型评估操作可能会更快(成千上万的项目是检查可能的一百个陈述).
只是好奇 :-)
在键盘上度过了漫长的一天,所以我伸出手:-)
我有一个UIPageViewController
典型的实现,基本上遵循Apple的标准模板.我正在尝试添加一个叠加层,允许用户执行操作,例如触摸按钮跳转到某些页面或关闭视图控制器以转到应用程序的其他部分.
我的问题是UIPageViewController
从我的叠加子视图中捕获所有事件,我正在努力寻找可行的解决方案.
这里有一些代码来帮助这个例子......
在viewDidLoad中
// Page creation, pageViewController creation etc....
self.pageViewController.delegate = self;
[self.pageViewController setViewControllers:pagesArray
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:NULL];
self.pageViewController.dataSource = self;
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
// self.overlay being the overlay view
if (!self.overlay)
{
self.overlay = [[MyOverlayClass alloc] init]; // Gets frame etc from class init
[self.view addSubview:self.overlay];
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.叠加层被创建,它会显示在UIPageViewController
您期望的页面顶部.当页面翻转时,它们会在叠加层下方翻转 - 再次正如您所期望的那样.
然而,UIButtons
在中self.overlay
视从未获得点击事件.该UIPageViewController
响应的所有事件.
我已经尝试过-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
根据这些建议而没有成功.
我已经尝试手动捕获所有事件并自己处理它们 - 不起作用(说实话,即使它确实看起来有点像黑客).
有没有人有关于如何捕获事件的建议,或者可能是更好的方法来使用叠加在顶部UIPageViewController
.
任何和所有的帮助非常感谢!!
objective-c uiview addsubview uitapgesturerecognizer uipageviewcontroller
我有一个NSMutableArray
用字符串对象填充的.为简单起见,我们会说对象是一个人,每个人对象都包含有关该人的信息.
因此,我将有一个填充了person对象的NSMutableArray:
person.firstName
person.lastName
person.age
person.height
Run Code Online (Sandbox Code Playgroud)
等等.
最初的数据源来自Web服务器,并在我的应用程序加载时填充并完成它与服务器的初始化.我的应用程序会定期轮询服务器以获取最新的名称列表.
目前我正在创建一个NSArray
结果集,清空NSMutableArray
然后在销毁对象之前重新填充NSMutableArray
with NSArray
结果NSArray
.
这对我来说在几个层面上看起来效率低下,并且还给我一个丢失表行参考的问题,我可以解决这个问题,但可能会为我自己创造更多的工作.
低效率似乎是我应该能够比较两个数组并最终得到过滤NSArray
.然后我可以将过滤后的集添加到NSMutableArray
.这意味着我可以简单地将新数据附加到NSMutableArray
而不是将所有内容丢弃并重新填充.
相反,我需要反向执行相同的过滤器,以查看是否有需要从中删除的记录NSMutableArray
.
有没有办法以更有效的方式做到这一点?我是否忽略了一些涉及更简单技术的文档中的某些内容?
当我清空NSMutableArray
并重新填充时,我有一个问题,任何引用表都会丢失它们选择的行状态.我可以跟踪它并重新选择它,但我的理论是使用某种形式的比较和添加对象并删除对象而不是在一个块中处理整个数组可能意味着我保留我的行引用(假设该项目不是当然删除了).
任何建议或帮助非常感谢.
更新
在我每次比较每个订单项时,快速枚举是否同样快?这似乎是一个昂贵的操作,但使用最后的快速枚举代码,它可能非常有效...
解
我最终选择了Abizem的建议.在处理大量数据集时,创建数组的可变副本和对象副本似乎比使用sbooth解决方案稍快一些.两者都很好用,我通过使用可变复制方法获得了更多优势.话虽如此,它确实让我睁开眼睛看着我以前没有看过的NSSet.
感谢您的反馈.
在尝试为NSInteger创建类别时,编译器会抱怨它"无法找到'NSInteger'的接口声明".是否无法创建NSInteger类别?
一个简单的测试将显示编译器错误:
#import <Foundation/Foundation.h>
@interface NSInteger (NSInteger_Extensions)
-(NSInteger)simpleTest;
@end
#import "NSInteger_Extensions.h"
@implementation NSInteger (NSInteger_Extensions)
-(NSInteger)simpleTest {
return self + 5;
}
@end
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
谢谢!
objective-c ×10
cocoa ×9
nsview ×3
.net ×1
addsubview ×1
asynchronous ×1
c# ×1
categories ×1
compare ×1
coordinates ×1
delegates ×1
drawrect ×1
grid ×1
if-statement ×1
installation ×1
macos-carbon ×1
nsarray ×1
nsinteger ×1
nsscrollview ×1
performance ×1
quicklook ×1
uiview ×1
windows ×1
xcode ×1