小编e.J*_*mes的帖子

如何以不同的颜色显示旋转的NSProgressIndicator?

我在我的可可应用程序中使用"spinner"NSProgressIndicator:

微调图像

我想以不同的颜色显示它,以便它在黑暗的背景上显示良好:

倒置的微调图像

我该怎么做呢?我的最后一招是编写我自己的自定义NSView子类来渲染自定义动画,但我甚至不确定从哪方面开始.任何帮助表示赞赏.

cocoa

22
推荐指数
5
解决办法
1万
查看次数

我应该如何重构我的代码以删除不必要的单身?

当我第一次看到反单身评论时,我很困惑.我在最近的一些项目中使用了单例模式,并且它运行得很漂亮.事实上,我已经使用了很多次.

现在,在遇到一些问题之后,阅读这个问题,尤其是这篇博文,我理解了我带给世界的邪恶.

那么:我如何从现有代码中删除单例?

例如:
在零售店管理程序中,我使用了MVC模式.我的Model对象描述了商店,用户界面是View,我有一组控制器,它们充当两者之间的联络.大.除了我将Store变成一个单独的(因为应用程序一次只管理一个商店),我还把我的大部分Controller类变成了单例(一个mainWindow,一个menuBar,一个productEditor ......).现在,我的大多数Controller类都可以像这样访问其他单例:

Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Run Code Online (Sandbox Code Playgroud)

我应该改为:

  1. 创建每个对象的一个​​实例,并将引用传递给需要访问它们的每个对象?
  2. 使用全局?
  3. 别的什么?

Globals仍然很糟糕,但至少他们不会假装.

我看到#1迅速导致可怕的膨胀构造函数调用:

someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Run Code Online (Sandbox Code Playgroud)

还有其他人经历过这个吗?如果不是全局变量或单个变量,那么为多个单独的类访问公共变量的OO方法是什么?

language-agnostic singleton refactoring

20
推荐指数
1
解决办法
5635
查看次数

如何通过编译器实现静态变量初始化?

我对函数中静态变量的底层实现感到好奇.

如果我声明一个基本类型的静态变量(char,int,double等),并给它一个初始值,我想编译器只是在main()调用之前在程序的最开始设置该变量的值.:

void SomeFunction();

int main(int argCount, char ** argList)
{
    // at this point, the memory reserved for 'answer'
    // already contains the value of 42
    SomeFunction();
}

void SomeFunction()
{
    static int answer = 42;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果静态变量是类的实例:

class MyClass
{
    //...
};

void SomeFunction();

int main(int argCount, char ** argList)
{
    SomeFunction();
}

void SomeFunction()
{
    static MyClass myVar;
}
Run Code Online (Sandbox Code Playgroud)

我知道直到第一次调用该函数时才会初始化它.由于编译器无法知道第一次调用函数的时间,它是如何产生这种行为的?它本质上是在函数体中引入if块吗?

static bool initialized = 0;
if (!initialized)
{
    // construct myVar
    initialized = 1;
}
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction static initialization

20
推荐指数
2
解决办法
2万
查看次数

是否存在反转NSColor值的常规方法?

我正在寻找一种在运行时反转任意NSColor值的方法,并且似乎没有任何内置方法可以这样做.

我将使用类别扩展NSColor如下:

NSColor * invertedColor = [someOtherColor inverted];
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的类别方法原型:

@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
    NSColor * original = [self colorUsingColorSpaceName:
                      NSCalibratedRGBColorSpace];
    return ...?
}
@end
Run Code Online (Sandbox Code Playgroud)

任何人都可以填补空白吗?这不一定是完美的,但我希望它有所帮助.即:

  1. [[[NSColor someColor] inverted] inverted] 会导致颜色非常接近原始颜色

  2. [[NSColor whiteColor] inverted] 会非常接近 [NSColor blackColor]

  3. 反转的颜色将位于色轮的相对侧.(红色和绿色,黄色和紫罗兰色等)

alpha值应保持与原始值相同NSColor.我只是想要反转颜色,而不是透明度.

更新3 :(现在颜色!)

事实证明,使用补色(颜色与原始色调相差180°的颜色)还不够,因为白色和黑色实际上没有色调值.从phoebus提供的答案开始,这就是我想出的:

CGFloat hue = [original hueComponent];
if (hue >= 0.5) { hue -= 0.5; } else { hue += 0.5; }
return …
Run Code Online (Sandbox Code Playgroud)

cocoa invert nscolor

19
推荐指数
1
解决办法
3202
查看次数

如何将id转换为浮点数?

我遇到了这段代码的问题:

NSRect itemFrame;
id item;
// code to assign item goes here.
itemFrame.origin.y -= [item respondsToSelector:@selector(selectedHeight)] ? [item selectedHeight]   : [self defaultSelectedHeight];
Run Code Online (Sandbox Code Playgroud)

这是有问题的一点:

[item selectedHeight]
Run Code Online (Sandbox Code Playgroud)

编译器假设返回类型是id.我虽然添加一个演员会解决这个问题:

(float)[item selectedHeight]
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

我究竟做错了什么?(我怀疑问题是解决与id相关的指针,但我找不到任何相关的文档).

macos casting objective-c

16
推荐指数
2
解决办法
3万
查看次数

有没有一种正确的方法来处理重叠的NSView兄弟姐妹?

我正在研究一个Cocoa应用程序,我遇到了一个我希望有两个NSView对象重叠的情况.我有一个父NSView,它包含两个子视图(NSView A和NSView B),每个子视图可以有几个自己的子视图.

有没有一种正确的方法来处理这种重叠?NSView B将始终位于NSView A的"上方",因此我希望屏蔽NSView A的重叠部分.

cocoa

16
推荐指数
2
解决办法
9505
查看次数

什么是断言或NSAssert在实践中有益?

我想知道在整个地方使用NSAssert是否是一个好习惯?这样做有什么好处?在哪些情况下使用它是个好主意?

iphone cocoa-touch uikit

16
推荐指数
4
解决办法
2万
查看次数

如何将类名作为参数传递给cocoa中的对象工厂?

我正在一个对象工厂上跟踪一小部分对象.对象可以是不同类型的,但它们都会响应createInstancereset.这些对象不能从公共基类派生,因为它们中的一些必须派生自内置的可可类,如NSViewNSWindowController.

我希望能够通过简单地将所需的类名传递给我的工厂来创建任何合适对象的实例,如下所示:

myClass * variable = [factory makeObjectOfClass:myClass];
Run Code Online (Sandbox Code Playgroud)

makeObjectOfClass:方法看起来像这样:

- (id)makeObjectOfClass:(CLASSNAME)className
{
    assert([className instancesRespondToSelector:@selector(reset)]);
    id newInstance = [className createInstance];
    [managedObjects addObject:newInstance];
    return newInstance;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将类名传递给方法,就像我(CLASSNAME)classNamemakeObjectOfClass:上面的参数所做的那样?

为了完整起见,这就是我想管理所有对象的原因.我希望能够通过调用一次性重置完整的对象集[factory reset];.

- (void)reset
{
    [managedObjects makeObjectsPerformSelector:@selector(reset)];
}
Run Code Online (Sandbox Code Playgroud)

cocoa constructor factory objective-c

15
推荐指数
2
解决办法
9969
查看次数

写入std :: string是否合法?

在std :: string中,只有const成员来获取数据,如c_str().但是我可以获得对字符串via的第一个元素的引用operator[],我可以写入它.

例如,如果我有功能:

void toupper(char *first,char *last_plus_one);
Run Code Online (Sandbox Code Playgroud)

我可以直接写向量获取指向第一个元素的指针:

vector<char> message // has "Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)

我可以用std :: string做同样的事情吗?

string message="Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)

标准是否保证内存的位置实际上是线性的?即:

&(*(message.begin()+n)) == &message[n]
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ string standards

14
推荐指数
3
解决办法
3663
查看次数

您使用什么类别的方法来使Cocoa编程更容易?

我为Cocoa的内置类使用了一组类别方法,使我的生活更轻松.我将发布一些例子,但我真的想看看其他编码员提出了什么.使用什么样的方便类别方法?

示例#1:

@implementation NSColor (MyCategories)
+ (NSColor *)colorWithCode:(long)code
{
    return [NSColor colorWithCalibratedRed:((code & 0xFF000000) >> 24) / 255.0
                                     green:((code & 0x00FF0000) >> 16) / 255.0
                                      blue:((code & 0x0000FF00) >>  8) / 255.0
                                     alpha:((code & 0x000000FF)      ) / 255.0];
}
@end

// usage:
NSColor * someColor = [NSColor colorWithCode:0xABCDEFFF];
Run Code Online (Sandbox Code Playgroud)

示例#2:

@implementation NSView (MyCategories)
- (id)addNewSubViewOfType:(Class)viewType inFrame:(NSRect)frame
{
    id newView = [[viewType alloc] initWithFrame:frame];
    [self addSubview:newView];
    return [newView autorelease];
}
@end

// usage:
NSButton * myButton = [someView addNewSubviewOfType:[NSButton class] …
Run Code Online (Sandbox Code Playgroud)

cocoa categories

14
推荐指数
2
解决办法
556
查看次数