2011-10-29 105 views
1

我剛開始使用X-Code 4.2開發應用程序。我使用單一視圖應用程序模板創建了該應用程序。按下按鈕後Main.m中的崩潰

我創建了一個MainIconViewController,它是一個包含圖像,標籤和按鈕的簡單VC。我的MainIconViewController視圖添加到我的mainViewController視圖,當按下按鈕我得到的main.m崩潰,說:

- [__ NSCFType mainButtonPressed:]:無法識別的選擇發送到實例0xb867ba0

的線發生事故的Main.m是:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

現在buttonPressed:是完全空的。

任何想法如何解決這個問題?

我只是試着做一個全新的項目來重新測試這個。我創建了該項目,創建了一個包含一個按鈕的viewController子類。然後,我在主視圖控制器中創建此視圖的一個實例,並將其添加到視圖中。當我按下按鈕時,應用程序就像以前一樣崩潰。

編輯: 這裏的所有代碼:

//MainIconViewController.h 
@protocol MainIconViewControllerDelegate <NSObject> 

-(void) openFileNamed:(NSString *)name; 
-(void) createNewFile; 

@end 

#import <UIKit/UIKit.h> 

@interface MainIconViewController : UIViewController { 


} 
@property (assign) id <MainIconViewControllerDelegate> delegate; 
@property (weak, nonatomic) IBOutlet UILabel *titleLabel; 
@property (weak, nonatomic) IBOutlet UIImageView *imageView; 
- (void)mainButtonPressed:(id)sender; 


@end 


////////////////////////////// 
//MainIconViewController.m 
#import "MainIconViewController.h" 

@implementation MainIconViewController 
@synthesize titleLabel; 
@synthesize imageView; 
@synthesize delegate; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (void)viewDidUnload 
{ 
    [self setTitleLabel:nil]; 
    [self setImageView:nil]; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return YES; 
} 
- (void)mainButtonPressed:(id)sender{ 

} 

@end 
+1

事實上,崩潰不在main()中,發佈按鈕操作代碼。 – zaph

+0

在按鈕動作中沒有任何內容 – Brodie

回答

0

首先你的方法必須聲明是這樣的:

- (IBAction)mainButtonPressed:(id)sender; 

然後你必須調用你的控制器是這樣的:

MainIconViewController *icon = [[MainIconViewController alloc]initWithNibName:@"your xib name without extension" bundle:nil]; 

(更安全,但沒關係,如果你的廈門國際銀行文件被命名爲喜歡控制器)

當然,不要忘記將你的按鈕鏈接到IB的行動。

檢查您的File's owner(進入IB)與MainIconViewController對應的xib設置爲MainIconViewController。

請注意,您在這裏有內存泄漏。你可以保留在你的班級的控制器,並釋放它不再需要的。如果發佈得太早,它會崩潰,因爲您的視圖在需要時沒有內存中的控制器。如果沒有發佈(就像在這裏那樣),控制器會一直留在內存中,並且你有內存泄漏。

請注意,您所採取的方式不是Apple推薦的(一個視圖層次結構=一個視圖控制器)。如果你使用ARC,那可能是你崩潰的問題。

+0

謝謝你讓我發現錯誤 - 出於某種原因,ARC在語言中關閉了,並在我的目標中發出了警告。我已經打開了,它工作正常。 – Brodie

0

如說,錯誤輸出,你還沒有宣佈你的頭文件的方法mainButtonPressed:

確保您的簽名如下所示:

- (void)mainButtonPressed:(id)sender; 
在你的頭文件

+1

...或者該方法可能不存在。嚴格地說,你不需要在頭文件中聲明該方法,如果你錯過了它,並且該方法仍然在你的實現中,你將不會得到無法識別的選擇器錯誤。這種方法更可能根本不存在,或者存在拼寫錯誤。 – lxt

+0

該方法存在並且在鍵入它時被完全聲明 – Brodie

+0

在某些情況下,編譯器會發出警告,告訴選擇器可能不存在(例如,SomeClassName可能不會響應選擇器SelectorName)。爲了避免警告,我更喜歡在標題中寫入所有選擇器。 – Raptor

0

檢查此視圖控制器的初始化。

+0

我需要檢查什麼?它是:MainIconViewController * icon = [[MainIconViewController alloc] initWithNibName:nil bundle:nil]; [viewForIcons addSubview:icon.view]; icon.view.frame = CGRectMake(40,20,icon.view.frame.size.width,icon.view.frame.size.height); – Brodie

0

你是如何創建你的視圖?您應該通過創建VC,然後使用視圖屬性訪問視圖或在視圖層次結構中顯示視圖控制器來完成此任務。

MainIconViewController *vc = [[MainIconViewController alloc]initWithNibName:@"MainIconViewController" bundle:nil]; 
[self.view addSubview:vc.view]; 
// or.... 
[self presentModalViewController:vc animated:NO]; 

否則,您在界面構建器中所做的連接將不會與此類連接。