2011-06-10 124 views
1

我试图创建一个简单的测验应用程序(我是一个初学者),当我启动应用程序时,我想要一个UILabel来显示第一个问题(一系列问题)。我在设置初始值时遇到了一些麻烦。设置初始值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]; 
} 

关于如何解决这个问题的任何提示都会很棒!

//安德斯

回答

6

希望你实际上没有把代码放入main.m。在iOS上,您很少修改该文件。因为你正在做AppDelegate中的所有事情,让我们把它放在那里(而不是创建一个新的UIViewController)。让我们从基础开始。

添加标签为一个实例变量

你这样做是正确的,里面的.h文件的大括号,放线

IBOutlet UILabel * questionField; 

然后,声明对应的属性,并确保在.m文件中进行合成。

@property (nonatomic, retain) IBOutlet UILabel *questionField; 
@synthesize questionField // in the .m file 

在Interface Builder

打开了MainWindow.xib添加的UILabel。将UILabel从库中拖到代表应用程序窗口的窗口中。然后从AppDelegate对象(Xcode 4中左侧的第三个图标;它将在IB 3中的文档窗口中标记)进行控制 - 拖动。您会看到一个黑色的小窗口 - 选择名为questionField的选项进行连接。

请参阅this link了解截图以及如何在IB中进行连接。这同样适用于在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 
+0

如果您要创建一个新的'UIViewController'子类,请转到基于视图的应用程序模板。然后在'.h'中声明ivar和property,并在'viewDidLoad'方法中放置'self.questionField.text = @“hello”;'。如果你“保留”它,你一定要在'dealloc'中释放标签。 – FeifanZ 2011-06-10 21:25:03

+0

非常感谢。它工作完美。 :D – Anders 2011-06-10 21:40:23

+0

出于好奇,你在做什么错了? – FeifanZ 2011-06-10 21:48:09

1

如果你编程方式创建的标签,那么你必须在标签添加到视图:

[self.view addSubview:questionField]; 

这是假设你有一个ViewController。如果没有,你直接在AppDelegate这样做(一个非常糟糕的主意,顺便说一下),然后做

[self.window addSubview:questionField]; 

如果你在IB创建它,请确保您设置的连接。

您应该而不是都在IB添加UILabel并以编程方式实例化它。如果您以编程方式创建它,请仅调用alloc。否则,如果使用IB,则跳过该部分。你已经用xib创建了它。

+0

...但是这个:IBOutlet UILabel * questionField;意味着视图是使用IB创建的。 – 2011-06-10 21:05:25

+0

也许意味着,但只有当程序员真的意味着。 – PengOne 2011-06-10 21:07:17

+0

感谢您的回答。将下面的错误放入我的.m文件中:QuizAppDelegate。m:错误:语义问题:在'QuizAppDelegate *'类型的对象上未找到属性'view'。是的,我已经使用了界面构建器。 – Anders 2011-06-10 21:13:29

0

我怀疑你要么没有正确创建Interface Builder布局 - 要么你错过了所有的控件,或者更可能没有将该控件连接到你的头文件中的questionField插座。

您需要将UILabel视图拖到主视图中,然后将其连接到头文件中的正确行。

+0

嗨,我有(cntrl)从UILabel拖到IBOutlet UILabel * questionField;我已经在头文件中导入了。我有其他类的coupe,我也需要吗? – Anders 2011-06-10 21:16:59

0

你应该不会像这样使用你的main.m。事实上,你几乎肯定不会对它做任何事情。尝试创建一个UIViewController子类,并用它练习你的测验。 (将UILabel添加到IB文件,然后连接插座。)也许在练习时使用基于视图的应用程序模板。

+0

'UIViewController'是一个不错的选择,但对于只使用基于Window的应用程序的初学者来说也是一个不错的选择。 – FeifanZ 2011-06-10 21:23:52

0

这是一个很好的回答: “你正在做这个 - 在.h文件的花括号里面,放行

IBOutlet UILabel * questionField;” 我试图改变mylabel.text的值,并且屏幕没有用this.value更新标签。我包括{IBOutlet UILabel * mylabel},它的功能就像一个魅力! 所以这个答案是有效的以编程方式更改标签的文本! 谢谢