【问题标题】:UIButton setTittle not working in a specific caseUIButton setTittle 在特定情况下不起作用
【发布时间】:2015-08-07 20:06:18
【问题描述】:

我的应用中有两个视图和一个用于存储一些值的 plist 文件。

在第一个视图中,我创建了一个名为 frequenciesButton 的按钮,用于打开第二个视图和另一个用于恢复默认值的按钮。

在第二个视图中,有一个 pickerView 和一个“完成”按钮。

在第一个视图的 .m 上:

- (void)viewDidLoad {
    [super viewDidLoad];
    //
    self.gameSettings = [[NSMutableDictionary alloc] initWithContentsOfFile:gameSettingsFilePath];

}

-(void)viewWillAppear:(BOOL)animated {
     [self refreshView];
}

- (void)refreshView {

    [self.frequenciesButton setTitle:[NSString stringWithFormat:@"%@ hz and %@ hz", [self.gameSettings objectForKey:@"freq-freq1"], [self.gameSettings objectForKey:@"freq-freq2"]] forState:UIControlStateNormal];
    ...

}

- (IBAction)setDefaultValues:(UIButton *)sender {

    [self.gameSettings setValue:@880 forKey:@"freq-freq1"];
    [self.gameSettings setValue:@1122 forKey:@"freq-freq2"];
    ...
    [self.gameSettings writeToFile:gameSettingsFilePath atomically:YES];
    [self refreshView];

}

加载第一个视图时,按钮标题更改为存储在gameSettings 字典中的默认值。 setTitle: 方法有效。

当我点击frequenciesButton 时,它会打开带有pickerView 的第二个视图,我为freq-freq1freq-freq2 选择了两个新值,并在完成按钮上保存到plist 文件中。

问题是frequenciesButton标题在第二个视图被解散并出现第一个视图时没有改变。调用了refreshView 方法,但按钮setTitle: 不起作用。

在这种情况下,如果我返回一个屏幕并返回此视图,按钮标题会更新。

当我点击defaultValuesButton 时,frequenciesButton 的标题会发生变化。方法setTitle:也可以。

对必须发生的事情有什么想法吗?

【问题讨论】:

  • 添加日志查看self.frequenciesButton是否为nil。
  • 我在 refreshView 方法中放置了一个 NSLog ,在 setTitle 之前和之后尝试过,它总是返回一个 UIButton。日志:<UIButton: 0x7ae9fc60; frame = (244 85; 180 30); opaque = NO; autoresize = LM+RM+BM; layer = <CALayer: 0x7ae9fd80>>
  • 我使用与我的应用程序相同的逻辑制作了一个小型测试项目:link。我也有同样的行为。

标签: ios objective-c xcode uibutton


【解决方案1】:

哈哈!我喜欢你为你的项目添加了一个链接。

所以!!问题是您在每个视图中都有单独的属性来保存保存的 plist 文件 self.settings 中的数据。这很好,不要将它们啮合在一起。在切换视图时,您必须这样做的要求是在数据更新时保持 ivar 或属性更新:D

这是我解决问题的方法:

- (void)viewWillAppear:(BOOL)animated {
    self.settings = [NSMutableDictionary dictionaryWithContentsOfFile: filePath];
    [self updateView];

}

我检查了文件并更新了,但TestViewController.h 中的字典没有更新

我希望这是问题所在:)

【讨论】:

    【解决方案2】:

    那里的一个问题,不确定它是否会解决它,是您错误地使用了 ViewWillAppear 的事实,您有这个:

    -(void)viewWillAppear:(BOOL)animated {
         [self refreshView];
    }
    

    但应该是这样的:

    -(void)viewWillAppear:(BOOL)animated {
         [super viewWillAppear:animated];
         [self refreshView];
    }
    

    您需要调用“[super viewWillAppear:animated];”否则你会有副作用,先解决这个问题,看看会发生什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多