2011-06-10 147 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},它的功能就像一個魅力! 所以這個答案是有效的以編程方式更改標籤的文本! 謝謝