【问题标题】:Change a button's background image programmatically in cocoa在可可中以编程方式更改按钮的背景图像
【发布时间】:2015-05-20 13:32:40
【问题描述】:

我在 Obj-c 中搜索过的所有主题都已过时或不完整。

当在 InterfaceBuilder 中有实际按钮时,我需要学习如何以编程方式更改按钮的背景图像。 (这听起来很奇怪,但NSCollectionView 需要它,因为我有许多具有不同背景图像的类似按钮)。

在界面构建器中,我将一个按钮拖到我的视图窗口上,之后我应该做什么?

我明白:

  • 我需要创建一个 NSButton 类
  • 将界面生成器中的按钮连接到代码
  • 设置图片

我一直在努力解决这个问题。

【问题讨论】:

标签: objective-c cocoa nsbutton


【解决方案1】:

那么您是否将按钮连接到 IBOutlet 属性?如果是这样,那么您需要做的就是使用 [button setImage:]

如果您还没有这样做,请确保要更改图像的对象实例位于界面生成器中,即已作为蓝色框之一放入。然后,如果您设置对象的类并在头文件中有一个 IBOutlet 属性,您只需将出口选项卡中的按钮出口(看起来像一个箭头)拖动到实际按钮本身以链接两者

编辑:所以看来您在按钮的实际连接部分遇到了问题?您的 IB 文件可能看起来有点像这样:

在左侧列表中查找对象部分。这些是代码中可以将按钮连接到的实际对象。您可能会在那里看到一个应用程序委托对象,该对象包含在您首次创建项目时生成的默认 IB 文件中。如果您想在应用程序委托中处理图像更改,只需将此属性添加到您的 AppDelegate.h 文件以创建一个插座:

@property IBOutlet NSButton *button;

如果您返回界面生成器并选择应用委托对象,您可以在插座选项卡下看到您刚刚创建的插座:

将小圆圈的东西拖到按钮上进行连接,这应该是最简单的一点。

但我只是假设您想从您的应用委托以外的其他地方调用它,为此我们需要做更多解释。如果您要从中调用它的类是 NSView 的子类并且已经在您的界面构建器中,您只需将该行添加到视图的头文件中,它将出现在视图的出口选项卡下。

如果您想从另一个不是视图或类似的对象调用它,您需要执行以下两个选项:

  1. 在界面生成器中创建对象实例。这意味着您不必使用alloc] init]; 等正常创建,而是必须将对象实际拖入界面构建器中。这会极大地改变对象的结构,因为您将无法再随意创建它,因为每当您加载 .nib 文件时,它都会自动实例化。还需要注意的是,您的 init 函数将不再被调用,您需要使用 awakeFromNib 代替。如果您确实选择沿着这条路线走,只需拖动一个对象即可:

将您的插座属性添加到头文件中:

设置对象的类:

并连接插座:

  1. 如果让对象加载 XIB 不是您的事,您可以随时将属性插座连接到您的应用程序委托/视图控制器并从中访问它。希望这可以解决问题,如果这是您遇到的问题。

【讨论】:

  • 感谢卢克的回答。无论如何,我可以通过电子邮件向您发送我所做的事情的照片吗?它比那复杂一点......
  • 为什么不编辑您的问题以包含屏幕截图?您提供的问题越详细,您得到的答案就越好
  • 我不喜欢公开显示我的电子邮件地址,但我的个人资料有一个指向我的 Twitter 的链接,如果你愿意将链接发送给我的话。
  • 谢谢卢克。我现在用一些代码创建了一个新主题,也许你可以研究一下? stackoverflow.com/questions/30353630/…
  • @ShaunArchibald 不需要创建“foto”属性或子类 NSButton,因为 NSButton 已经有一个背景图像属性,可以用[button setImage:];编辑
【解决方案2】:

对于 iOS:

不需要创建 NSButton 子类。

您只需要在 Storyboard 上添加按钮,为您的按钮设置 IBOutlet 属性(从您的按钮 ctr+拖动到您的视图控制器),并设置背景图像:

[myButton setBackgroundImage:[UIImage imageNamed:@"ImageName"] forState:UIControlStateNormal]

对于 MacOS:

你可以使用

setImage:

Apple Doc 上所述,并更改其大小/位置

(对不起,我的英语不好)

【讨论】:

    【解决方案3】:

    当然,正如 Duukee 所说,我认为不需要手动创建任何 NSButton 或 UIButton 实例当我们在 Interface Builder 中有一个对象时,我们可以按如下方式使用它的出口,

    UIImage* Desired_Image=[UIImage imageNamed:@"yourimage.png"];
    [My_Button setimage:Desired_Image forState:UIcontrolstateNormal];
    

    HTH!快乐编码:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2020-05-15
      • 2012-07-11
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多