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文件中实例化。
任何?
答案 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