【问题标题】:Change alpha and enabled UIButton of ClassA from ClassB in object c从目标 c 中的 Class 更改 alpha 并启用 Class 的 UIButton
【发布时间】:2012-01-04 16:26:05
【问题描述】:

我在 ClassB 中更改了 UIButton 的参数,但 UIButton 是在 ClassA 中声明的。 我如何从 ClassB 中看到?

简单地说:

_closeButton.alpha = 1;
_closeButton.enabled = TRUE;

感谢回复!!

好的,我试过这个: 在 ClassB.h

ClassA *_closeButtonController;

在 ClassB.m didLoad 中:

_closeButtonController = [[ClassA alloc] initWithNibName:@"ClassA" bundle:nil]; _closeButtonController._closeButton.enabled = TRUE; _closeButtonController._closeButton.alpha = 1;

我没有错误但不工作!


@Warkst 在 ClassA.h 我已经删除了 @property (nonatomic, retain) IBOutlet UIButton *_closeButton;并在 ClassA.m @synthesize _closeButton;处处使用下划线!

我已经用这段代码解决了: 在ClassA.m中

    - (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showAndEnableCloseButton) name:@"EnableCloseButton" object:nil];
}

....

- (void)showAndEnableCloseButton
{
    _closeButton.alpha = 1;
    _closeButton.enabled = YES;
}

在 B 类.m 当 "TouchUpInside" UIButton 时,关闭 ClassB 的 View 并返回 ClassA 的视图,调用 NSNotificationCenter 的 ClassA _closeButton 的变化:

- (IBAction)close:(id)sender
{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"EnableCloseButton" object:self];
    [self.view removeFromSuperview];
}

我希望我对某人有所帮助, 谢谢大家的回复! 美好的一天!

【问题讨论】:

  • 好的,你是如何申报你的财产的?是不是这样:属性(...) UIButton * closeButton;然后在你的 .m 文件中合成 closeButton = _closebutton?还是到处都有下划线? IBOutlet 是如何调用的?

标签: objective-c class


【解决方案1】:

您应该使用委托来执行此操作。 ClassA 将是 ClassB 的代表。当 ClassB 需要更改 ClassA 中的 UIButton 时,它会从 ClassA(它的委托)调用一个直接执行此操作的方法。 B 类内部:

[self.delegate changeButtonFor:self];

ClassA 中的 changeButton 方法然后会做你想做的事,直接到 UIButton。

你需要在ClassB中创建一个delegate属性,并在之前将其设置为ClassA:

self.delegate = _closeButtonController;

这是您需要放入 ClassB 头文件的内容:

@class ClassB;

@protocol ButtonDelegate
- (void)changeButtonFor:(ClassB *)aClass;
@end

@interface ClassB : ...
{
    id <ButtonDelegate> delegate;
}

@property (assign) id <ButtonDelegate> delegate;

别忘了在实现文件中综合一下:

@synthesize delegate;

现在,在 ClassA 的头文件中,声明它采用 ButtonDelegate 协议:

#import "ClassB.h"

@interface ClassA: ... <ButtonDelegate>

然后在实现中实现changeButtonFor方法,用对接做你想做的事:

@implementation ClassA

- (void)changeButtonFor:(ClassB *)aClass
{
    button1.alpha = 0.5;
    ...
}

【讨论】:

  • 我有一个错误:'@protocol ButtonDelegate - (void)changeButtonFor:(ClassB *)class; @结尾;'预期类型
  • 把这个放在@protocol 声明之前:@class ClassB;。我做了一些改进:将参数名称从class 更改为aClass(在标头和实现中)。
【解决方案2】:

我想您可以在 ClassA 中添加一个设置按钮参数的方法,然后从 ClassB 调用该方法,假设您有对 ClassA 对象的引用。所以:

在 ClassA.h 中

- (void)showAndEnableCloseButton;

在 ClassA.m 中

- (void)showAndEnableCloseButton{
    self._closeButton.alpha = 1;
    self._closeButton.enabled = YES;
}

在 ClassB.h 中

ClassA * _closeButtonController;
// ...
@property (nonatomic, retain) ClassA * _closeButtonController;

在 ClassB.m 中

@synthesize _closeButtonController;

然后,在您的 ClassA 对象中,您创建一个 ClassB 对象:

// somewhere in the code from ClassA.m
ClassB * bObj = [[ClassB alloc] init];
bObj._closeButtonController = self;
// ...

然后,当您想从 ClassB 中的某个位置修改按钮时,您只需执行以下操作:

//...
[self._closeButtonController showAndEnableCloseButton];
//...

这应该可行。希望对您有所帮助!

【讨论】:

  • 好的,我有一个警告“!”在 bObj._closeButtonController = self;从“ClassB *”分配给“ClassA *”的不兼容指针类型
  • 首先我犯了一个小错误,您应该将 ClassB.h 中的变量名称从 closeButtonController 更改为 _closeButtonController。其次,在我提供的代码中,您将 bObj 的委托分配给 self,我假设您在 ClassA 对象中执行此操作。如果不是,请将“self”更改为包含对 closeButton 的引用的任何 ClassA 对象。
【解决方案3】:

在B类中取classA对象。当你从A类到B类时,然后设置classBObject.classAobj = self。

【讨论】:

  • mmm 不是很明白能重新解释一下吗?谢谢!
猜你喜欢
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2017-10-16
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多