我正在尝试创建一个简单的测验应用程序(我是初学者),当我启动应用程序时,我想要一个UILabel来显示第一个问题(一系列问题)。我在设置初始值时遇到了一些麻烦。
我做了几次尝试,成功了。我的QuizAppDelegate.h文件我声明我的UILabel是这样的:
IBOutlet UILabel * questionField;
在我的主.m文件中,我尝试了以下内容:
- (id)init {
[super init];
questions = [[NSMutableArray alloc] init];
// Not working
questionField = [[UILabel alloc] init];
[questionField setText:@"Hello"];
// Working
NSLog(@"Hello");
[self defaultQuestions];
// [self showQuestion];
return self;
}
我尝试过的另一件事是QuizAppDelegate中的以下内容:
@property (nonatomic, retain) IBOutlet UILabel *questionField;
- (void)changeTitle:(NSString *)toName;
在.m文件中:
@synthesize questionField;
- (id)init {
[super init];
questions = [[NSMutableArray alloc] init];
// Not working
[self changeTitle:@"Hello"];
// Working
NSLog(@"Hello");
[self defaultQuestions];
// [self showQuestion];
return self;
}
-(void)changeTitle:(NSString *)toName {
[questionField setText:toName];
}
如何解决这个问题的任何提示都会很棒!
// Anders
答案 0 :(得分:6)
希望您实际上没有将代码放入main.m
。在iOS上,您很少修改该文件。
由于您正在AppDelegate中执行所有操作,因此请将其保留在那里(而不是创建新的UIViewController
)。让我们从基础开始。
将Label添加为实例变量
你正确地做到了这一点 - 在.h
文件的大括号内,放行
IBOutlet UILabel * questionField;
然后,声明相应的属性,并确保在.m
文件中合成它。
@property (nonatomic, retain) IBOutlet UILabel *questionField;
@synthesize questionField // in the .m file
在Interface Builder中添加UILabel
打开MainWindow.xib
。将UILabel从库拖到代表应用程序窗口的窗口。然后从AppDelegate对象进行Control-Drag(Xcode 4左侧的第三个图标;它将在IB 3的Document窗口中标记)。你会看到一个小黑窗口 - 选择名为questionField
的选项来建立连接。
有关屏幕截图以及如何在IB中建立连接,请参阅this link。这同样适用于Xcode 4.
更改文字
您不需要单独的方法来更改文本 - 只需修改标签的text
属性。
选择一个在应用启动时调用的方法(applicationDidFinishLaunching:WithOptions:
是一个很好的地方),并输入以下代码:
questionField.text = @"Hello";
就是这样!
<强>代码强>
QuizAppDelegate.h
#import <UIKit/UIKit.h>
@interface QuizAppDelegate : NSObject <UIApplicationDelegate> {
IBOutlet UILabel *questionField;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UILabel *questionField;
@end
QuizAppDelegate.m
#import "QuizAppDelegate.h"
@implementation QuizAppDelegate
@synthesize window=_window;
@synthesize questionField;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// Add the tab bar controller's current view as a subview of the window
[self.window addSubview:self.questionField];
[self.window makeKeyAndVisible];
self.questionField.text = @"Hello";
return YES;
}
- (void)dealloc
{
[_window release];
[questionField release];
[super dealloc];
}
@end
答案 1 :(得分:1)
如果您以编程方式创建标签,则必须将标签添加到视图中:
[self.view addSubview:questionField];
这假设您有一个ViewController
。如果没有,你直接在AppDelegate
(顺便说一句,这是一个非常糟糕的主意)这样做,那么
[self.window addSubview:questionField];
如果您要在IB中创建它,请确保设置连接。
你应该不在IB中添加UILabel并以编程方式实例化它。如果要以编程方式创建,请仅调用alloc
。否则,如果使用IB,请跳过该部分。您已经使用xib创建了它。
答案 2 :(得分:0)
我怀疑您没有正确创建Interface Builder布局 - 要么您完全错过了控件,要么更有可能是您没有将该控件连接到yout头文件中的questionField
插座。
您需要将UILabel视图拖动到主视图中,然后将其连接到头文件中的正确行。
答案 3 :(得分:0)
你根本不应该那样使用你的main.m
。事实上,你几乎肯定不会对它做任何事情。尝试创建一个UIViewController
子类并练习你的测验。 (将UILabel添加到IB文件,然后连接插座。)也许在练习时使用基于视图的应用程序模板。
答案 4 :(得分:0)
这是一个很好的答案: “你正确地做到了这一点 - 在.h文件的花括号内,放行
IBOutlet UILabel * questionField;“ 我试图更改mylabel.text的值,屏幕没有使用this.value更新标签。我加入了{IBOutlet UILabel * mylabel},它就像一个魅力! 所以这个答案对于以编程方式更改标签的文本是有效的! 感谢