我正在创建一个应该在停靠栏图标中显示进度条的应用程序.目前我有这个,但它不起作用:
NSProgressIndicator *progressIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0.0f, 0.0f, 10.0f, 20.0f)];
[progressIndicator setStyle:NSProgressIndicatorBarStyle];
[progressIndicator setIndeterminate:NO];
[[[[NSApplication sharedApplication] dockTile] contentView] addSubview:progressIndicator];
[progressIndicator release];
Run Code Online (Sandbox Code Playgroud)
或者我必须自己在码头上画画吗?谁能帮我?谢谢.
经过大量搜索后,在尝试执行文件复制并显示相对于已复制文件数量的进度指示器时似乎存在常见问题.在花了一些相当长的时间试图解决这个问题后,我发现自己再次受到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
我正在尝试在状态栏菜单中使用NSProgressIndicator(不确定).我正在使用NSView对象作为menuitem的视图,然后查看进度指示器以显示它.但每当我尝试调用startAnimation时:对于进度,没有任何反应.当我尝试在普通的NSWindow上做同样的事情时,它可以很好地工作,而不是在一个menuitem中.
我是cocoa和objective-c的新手,所以我可能会忽略一些"显而易见的"但我已经搜索了很多但是没有成功.我发现一些关于menuitems的东西在显示时无法更新,你需要使用无边框窗口.但我无法在任何文档中证实这一点.
编辑:
好的,现在差不多了.当使用setUsesThreadedAnimation:并从MenuDelegate的menuWillOpen中创建一个新线程.该线程运行本地方法:
-(void) doWork(NSProgressIndicator*) p{
[p startAnimation:self];
}
Run Code Online (Sandbox Code Playgroud)
这将在打开菜单时以随机(?)为基础启动progressindicator.如果我startAnimation:直接打电话doWork:(仍然使用新线程),它永远不会工作.不setUsesThreadedAnimation:使进度条为动画创建自己的线程吗?
NSProgressIndicator有方法调用startAnimation:和stopAnimation:,但我找不到检查状态的方法(目前是否为动画).你会怎么做?
我所拥有的是NSTask运行一个长预制的shell脚本,我希望NSProgressIndicator检查完成了多少.我尝试过很多东西,但似乎无法让它发挥作用.如果进度条不确定但我希望它随着任务的进行而加载,我知道如何使用它.
以下是我运行脚本的方法:
- (IBAction)pressButton:(id)sender {
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObjects:[[NSBundle mainBundle] pathForResource:@"script" ofType:@"sh"], nil]];
[task launch];
}
Run Code Online (Sandbox Code Playgroud)
我需要设置一个进度条来检查该任务发生的进度并相应地更新.
所以我有一个简单的用户界面,一个开始按钮,一些文本/标签和一个进度条.单击"开始"按钮时,NSProgressIndicator 应设置动画.这是我的代码:
@synthesize progressBar = progressBar;
/* Some code and setup stuffs... */
- (IBAction)startAction:(id)sender {
NSLog(@"Button clicked.");
NSLog(@"Beginning Socketry and socket creation...");
[progressBar setUsesThreadedAnimation:YES];
[progressBar setIndeterminate:YES];
[progressBar startAnimation:progressBar];
}
Run Code Online (Sandbox Code Playgroud)
我检查了多个源(Apple Developer Portal等),但没有任何效果.我不必拥有NSPIndicator,但如果可以的话,它会非常好.另外,这是我的AppDelegate.h文件:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (weak) IBOutlet NSProgressIndicator *progressBar;
- (IBAction)saveAction:(id)sender;
- (IBAction)startAction:(id)sender;
- (IBAction)changeStatus:(id)sender;
- (IBAction)changeProgress:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud) 改变NSProgressIndicator颜色的最佳方法是什么,是否有一种更简单的方法,而不仅仅是将其子类化,然后自己绘制整个组件?
基本上我想要做的是拥有一个类似的组件,但能够改变条形的颜色.
我试图谷歌这个,但所有的问题都已经过时了,并没有真正涉及我正在研究的10.10 OS X版本.还检查了cocoa控件,并且只发现了一个用于过时的OS X版本的组件.
当我将进度指示器的背景设置为绿色时,它会按预期工作.
代码:
loadingIndicator.wantsLayer = true
loadingIndicator.layer?.backgroundColor = NSColor.greenColor().CGColor
Run Code Online (Sandbox Code Playgroud)
结果:
但是当我将背景颜色设置为白色时,背景颜色保持灰色(而不是变为白色).
代码:
loadingIndicator.wantsLayer = true
loadingIndicator.layer?.backgroundColor = NSColor.whiteColor().CGColor
Run Code Online (Sandbox Code Playgroud)
结果:
为什么将背景颜色设置为白色不起作用,但绿色呢?我该如何纠正这个问题?我在OS X 10.11.4上.
编辑:这显然只有当进度指示器位于以弹出窗口显示的视图内时才会发生.
我想使用NSProgressIndicator来显示一些进展.但我找不到一种方法来增加控制的范围.我也没有在网上找到一个例子.
let progressbar = NSProgressIndicator()
progressbar.frame = NSRect(x: 100, y: 20, width: 150, height: 10)
progressbar.minValue = 0
progressbar.maxValue = 10
self.window.contentView?.addSubview(progressbar)
for i in 0...10 {
progressbar.incrementBy(1) //has no effect
}
Run Code Online (Sandbox Code Playgroud) 我喜欢子类化NSProgressIndicator.我已经使用了这段代码,并在Interface Builder中设置了Subclass:
- (void)drawRect:(NSRect)dirtyRect {
NSRect rect = NSInsetRect([self bounds], 1.0, 1.0);
CGFloat radius = rect.size.height / 2;
NSBezierPath *bz = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
[bz setLineWidth:2.0];
[[NSColor blackColor] set];
[bz stroke];
rect = NSInsetRect(rect, 2.0, 2.0);
radius = rect.size.height / 2;
bz = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
[bz setLineWidth:1.0];
[bz addClip];
rect.size.width = floor(rect.size.width * ([self doubleValue] / [self maxValue]));
NSRectFill(rect);
Run Code Online (Sandbox Code Playgroud)
当应用程序启动时,它看起来像这样:

但在复制过程中,旧栏出现了.

怎么了?
cocoa ×8
objective-c ×5
macos ×4
nsview ×2
swift ×2
animation ×1
dock ×1
ibaction ×1
macos-carbon ×1
nsdocktile ×1
nsmenuitem ×1
nstask ×1
subclass ×1