Xcode - 在其他视图中按下按钮时更新标签文本

时间:2014-09-12 09:18:29

标签: ios objective-c

Xcode大师的新手问题......

我有两个观点。它们都使用相同的自定义类。在view_1中,我有一个按钮,当按下此按钮时,将显示view_2。在view_2中,我有一个标签,当我按下view_1中的按钮时,它会改变文本。截至目前,当我设置断点时,Label_1为零,因此无用。按下按钮后如何更新此标签?她是我代码中的一些片段......

这是我的.h文件:

@interface ViewController : UIViewController
{
    IBOutlet UIButton *buttonSelectTimeInterval;
    IBOutlet UILabel *labelTimer;
}
@end

这是我的.m文件中的按钮操作:

- (IBAction)startPouring_ButtonClick:(id)sender 
{
    labelTimer.text = @"foo";
}

...但我的.m文件似乎不知道labelTimer,因为它是'nil'。为什么会这样?它在.h文件中实例化。

任何?

see image for overview

3 个答案:

答案 0 :(得分:1)

您可以使用NSNotificationCenter。把它放在你的IBAction中。

  

[[NSNotificationCenter defaultCenter] postNotificationName:@" buttonPressed"对象:无];

这是你的viewDidLoad。

  

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selectorhere)name:@" buttonPressed"对象:无];

你的.m

中的某个地方
  

(void)selectorhere {

     

labelTimer.text = @" foo&#34 ;;

     

}

答案 1 :(得分:0)

您可以使用NSNotificationCenter
以下是苹果文档link

答案 2 :(得分:0)

首先,没有任何东西被"实例化"在.h文件中 - 这只是其他类可用的属性和方法的公开列表。将头文件视为目录,但仅限于类希望其他人看到的内容。

在创建类本身的实例之前,这些属性不会存在于内存中,只有在您需要时才将它们设置为某个初始值。

&你在哪里创建第二个视图?它是故事板还是什么?第一个视图似乎没有任何方式知道第二个视图存在,因此它无法查看或访问标签。

View1Class.m

#import View2Class.h 

@implementation View1Class

- (IBAction)startPouring_ButtonClick:(id)sender {
     //Instantiate the 2ndView when you need it. 
     // This gives View1 a reference to View2 and its public UILabel.  
     View2Class * my2ndView = [[View2Class alloc] init];
     my2ndView.labelTimer.text = @"foo";
}

@end

正如我所说的那样,它仍然不清楚你实际显示第二个视图的方式/位置,所以上面的代码段是不完整的。您可以使用带委托的模式,或者NSNotificationCenter是一个有用的选项 - 第二个视图可以注册以获取通知&相应地改变。有很多关于创建第二/模态视图并在按钮点击上显示它的教程 - 您应该查看这些以澄清这样一个应用程序的结构应该如何工作。 This answer应该让你走上正轨。

其他具体问题:

为什么标签为nil?因为没有......

在这个IBAction中,似乎在视图1中:

- (IBAction)startPouring_ButtonClick:(id)sender 
{
    labelTimer.text = @"foo"; //this is looking for labelTimer in the clicked view.
}

...它正在寻找自己的labelTimer IBOutlet(在这种情况下它应该是self.labelTimer.text),而不是第二个视图。如果第一个视图甚至没有UILabel IBOutlet,这是另一个问题。

如果视图具有不同的功能&不同的属性,它们可能不应该是同一个自定义类的实例。如果第一个视图不具有或不需要UILabel,则它的.h中不应该有一个UILabel。如果第二个视图没有或不需要一个按钮,则它的.h中不应该有一个按钮。如果视图用于不同的目的,那么将它们设为不同的类。

BTW,

由于您正在为IBOutlets使用实例变量,因此您需要编写自己的getter& amp;如果要更改其值,请使用setter方法。你是否?为了使这些值可供其他类访问,您需要将这些方法公之于众。把它们放在.h。对于实例来说,直接使用getter / setter设置其实例变量并不是一个好习惯,而其他对象肯定不应该这样做。

首选方法是将@properties用于IBOutlet,而不是将它们声明为实例变量。这将自动创建吸气剂和放大器。 setter方法,在内存中支持存储,从XCode 4.4开始,它会自动添加@synthesize,因此您不再需要这样做。将您的IBOutlets声明为“弱”"参考文献可以防止保留周期和内存泄漏,视图保持在插座和网点坚持观点和视角什么都没有消失......

View1Class.h

@interface ViewController : UIViewController

@property (nonatomic, weak) IBOutlet UIButton *buttonSelectTimeInterval;

@end

View2Class.h

@interface ViewController : UIViewController

@property (nonatomic, weak) IBOutlet UILabel *labelTimer;

@end