从另一个类修改 UIButton 的 alpha 属性
Posted
技术标签:
【中文标题】从另一个类修改 UIButton 的 alpha 属性【英文标题】:Modifying UIButton's alpha property from another class 【发布时间】:2013-02-23 19:31:08 【问题描述】:我正在尝试从另一个类更改UIButton
的alpha
。在设置我的 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 从 Core Data 增加一个数组,从另一个类完成