从另一个类修改 UIButton 的 alpha 属性

Posted

技术标签:

【中文标题】从另一个类修改 UIButton 的 alpha 属性【英文标题】:Modifying UIButton's alpha property from another class 【发布时间】:2013-02-23 19:31:08 【问题描述】:

我正在尝试从另一个类更改UIButtonalpha。在设置我的 UIButton 的 alpha 属性中调用的函数实际上被调用了,因为我在那里放了一个 NSLog 并且我可以看到它是如何工作的。如果您能给我任何建议,我将不胜感激。

这是我当前的代码。

ViewController.h

- (void) setAlphaToButton;

@property (strong, nonatomic) IBOutlet UIButton *myButton;

ViewController.m

@synthesize myButton;

- (void) setAlphaToButton 
    myButton.alpha = 0.5;
    NSLog(@"Alpha set");

ImageViewSubclass.m

- (void) tapDetected:(UITapGestureRecognizer *)tapRecognizer 
    ViewController *VC = [[ViewController alloc] init];
    [VC setAlphaToButton];

当按下图像视图时,在我的控制台中我得到:Alpha set。而且按钮没有变化。

【问题讨论】:

你的问题是? 50% 的透明度不起作用?它是完全出现还是根本不出现?您是在调试器中还是在 nslog 的帮助下检查了 alpha 值?您是否尝试过其他值,例如 0 或 0.3f? 按钮显示时 alpha 设置为 1.0,因此它根本不会改变其状态。 【参考方案1】:

在您的代码中,分配并初始化了一个 ViewController 的实例,并在其上调用了 setAlphaToButton 方法。然后释放视图控制器,因为您没有保留它的对象。这就是为什么您看不到任何效果的原因;您调用该方法的 ViewController 实例永远不会出现在屏幕上。

不清楚您的代码应该如何工作;调用 tapDetected 时是否存在 ViewController 的实例?如果是这种情况,并且这是您要更改其 alpha 的按钮的 ViewController,那么您需要引用 ViewController 的 那个 实例并在其上调用 setAlphaToButton。

【讨论】:

我不太明白你想告诉我什么。如果您可以发布一些代码,我想我会更好地理解它。还是谢谢。 我可以这样做,但我需要更多地了解您的代码是如何设置的,以便对您有用。 ImageViewSubclass 视图是否是已添加到 ViewController 视图的子视图?并展示如何将 UITapGestureRecognizer 添加到 ImageViewSubclass 以及添加位置的代码。 是的,我将ImageViewSubclass 添加到ViewController 中。我实际上有很多ImageViewSubclassess,当我检测到多个被按下时,我的想法是为UIButton 设置一个alpha,它也在ViewController 内。问题是如果选择了多个,则要处理的代码在ImageViewSubclass 内。我希望你现在能更好地理解它。 我建议您将检测是否按下多个按钮的代码移至 ViewController。 无论如何,tapDetected 函数都需要调用 ViewController 函数,你不觉得吗?我没有看到将检测代码放在 ViewController 中的好处。【参考方案2】:

在您尝试设置 alpha 时,您的视图未加载!您需要在 viewDidLoad 触发后调用此方法。您可以通过调用 view 来强制它,但这是一种 hack,不推荐!

MyViewController *vc = [MyViewController new];
vc.view; // this string will force view loading 
[vc setAlphaToButton];

【讨论】:

好的,然后尝试 NSLog(@"self.button = %@", self.button);在你的 setAlphaToButton 方法中。是==零吗?最好在 viewDidLoad 方法中设置 IBOutlets 附加设置。 您必须意识到您创建了视图控制器的新实例并设置了 alpha,您不应该期望视图层次结构中的某些现有视图会被更改。还要确保实际触发了轻击检测方法。【参考方案3】:

在imageviewsubclass中添加uiviewcontroller类的属性为

ImageViewSubclass.h
@propery (nonatomic, retain) uiviewController *parent;
ImageViewSubclass.m
@synthesize parent;

当初始化 imageviewsubclass 的对象并添加到视图上时,在视图控制器类中用“self”初始化它

ImageViewsubclass *oneObj = [ImageViewsubClass alloc] init];
oneOBj.parent = self;

对 ImageviewsubClass 对象的所有对象执行相同操作。

- (void) tapDetected:(UITapGestureRecognizer *)tapRecognizer 
    [parent setAlphaToButton];

【讨论】:

这可能有效,但是将视图控制器作为视图的属性是违反 MVC 的。最好使用委托并使视图控制器成为视图的委托。代码类似。 @Darren 在这里,我们只有对 viewcontroller 的引用,它负责在 view 上执行的任何操作,没有别的 是的,我明白了。它在功能上与拥有代表相同。但不鼓励这样做的原因是,使用您的代码的人会看到他们可以在 ImageViewSubclass 对象上设置视图控制器属性,但是通过查看界面,他们无法知道如果视图控制器没有,代码将会崩溃'不实现 setAlphaToButton.

以上是关于从另一个类修改 UIButton 的 alpha 属性的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何从另一个类 X 更新 UILabel:UIButton

从不同的类更改 UIButton alpha

UIButton 从 Core Data 增加一个数组,从另一个类完成

Swift:从另一个类调用 UIButton press

从另一个控制器的 UIPickerView 更新 UIButton 的标题

UIButton 背景图像从另一个按钮更改