【问题标题】:Objective-c / xcode - Access button state in different classObjective-c / xcode - 访问不同类中的按钮状态
【发布时间】:2013-05-27 10:15:07
【问题描述】:

所以我尝试了很多不同的方法,但我无法让它发挥作用。我试图在不同的类中更改 UIbutton 的状态。

class1.h

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

class2.m

- (void)viewDidLoad
{
    ViewController *vc = [[ViewController alloc] init];
    vc.monthly.enabled = NO;
}

无论我尝试什么以及将代码放在哪里,按钮状态都不会改变。当我在 class2.m 中记录状态时:

NSLog(vc.monthly.enabled ? @"Yes" : @"No");

它总是返回 No,即使我只是在我的 class2.m 中将其声明为 YES。长话短说:我的按钮属性没有从不同的类更新。如果您需要查看更多代码,请告诉我,我会尽快更新。

【问题讨论】:

  • 检查 IBOutlet 的连接。你在你的代码中找到合适的 UIButton 对象了吗?
  • 您没有访问您的按钮。您正在启动一个新的视图控制器并访问它的按钮。
  • @Apurv 你是什么意思..?我不认为他们的插座有什么问题,因为它在主课上工作。
  • @Desdenova 那么我将如何访问不同类的原始按钮?我也尝试使用设置为按钮状态的全局变量,但这也没有用。
  • 启用按钮时,如果是通过XIB添加的,则不会实例化。设置一个标志并使用该标志从 viewDidLoad 设置按钮状态:

标签: iphone ios objective-c uibutton


【解决方案1】:

我认为问题出在类实例上。以下行创建新实例

ViewController *vc = [[ViewController alloc] init];

这就是为什么您的按钮状态没有改变的原因,您必须获取之前创建的 intstace 的引用,而无需创建新实例。

为此,您可以使用 AppDelegate 文件来声明 class1 的属性。

见以下代码

AppDelegate.h

@Property(nonatomic, ratain) ViewController *vc;

AppDelegate.m

@synthesize vc;

现在在需要时分配和初始化 vc,如下所示。

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] 委托]; appDelegate.vc=[[ViewController alloc] 初始化];

别忘了在上面的代码中导入 AppDelegate.h 文件。

现在使用 appDelegate.vc,您可以在项目的所有类中使用 View Controller 的所有属性。

【讨论】:

  • 我完成了你建议的所有步骤,并在我的 class2.m 中添加了: - (void)viewDidLoad { NSLog(@"SPENDINGVIEW REACHED"); AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; appDelegate.vc=[[ViewController alloc] 初始化]; appDelegate.vc.monthly.enabled = 否;}。 NSLog 正在工作,但我的按钮状态仍然没有改变..
  • @Tarayaa 你在 class2.m 中包含 AppDelegate.h 了吗?
  • 是的,我做到了,没有收到任何错误,但状态没有改变。
  • @Tarayaa 确保 ViewController 的实例在整个项目中只声明一次
  • @PR J 这给了我一个好的方向的线索,我有:@property(nonatomic, assign) ViewController *delegate;在我的课上。我删除了整个 AppDelegate 行并添加了:_delegate.monthly.enabled = NO;它奏效了。你能解释一下为什么会这样吗?
【解决方案2】:

主要问题是每次要检查按钮状态时都在创建新实例。但按钮状态是针对您在class1.h 中创建的按钮。因此,您需要在Appdelegate 类中创建按钮,并从您正在检查按钮状态的类中的Appdelegate 获取实例并检查按钮的状态。我认为这会有所帮助。

【讨论】:

    【解决方案3】:

    使用已在堆栈中的ViewController 类的对象访问按钮。无需创建像ViewController *vc = [[ViewController alloc] init]; 这样的新对象。当你这样做时,它会创建一个新对象,所以你不会得到写入的东西。

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多