2012-03-17 104 views
15

我正在創建一個簡單的RSS應用程序,我在Objective-c中並不擅長。應用程序將始終構建成功,並且沒有錯誤或警告,在讀取RSS的UITableView中,只要按下單元格,它將終止並在main.m中,此線程將在此行中顯示「線程1:信號SIGABRT」 :Xcode錯誤 - 線程1:信號SIGABRT

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

我的應用程序的信息:

該應用程序是由版本的Xcode創建:4.3.1 這個應用程序從iPhone和一臺MacBook的「主從應用程序」模板創建的。 我使用調試器是LLDB和我的iPhone模擬器是5.1 我用故事板

這裏是main.m文件:

#import <UIKit/UIKit.h> 

#import "AppDelegate.h" 

int main(int argc, char *argv[]) 
{ 

    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

的AppDelegate.h是:

#import <UIKit/UIKit.h> 

@interface AppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UINavigationController *navigationController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

@end 

我的AppDelegate.m是:

#import "AppDelegate.h" 




#import "AppDelegate.h" 
#import "MasterViewController.h" 


@implementation AppDelegate 

@synthesize window; 
@synthesize navigationController; 


#pragma mark - 
#pragma mark Application lifecycle 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after app launch  

    [window addSubview:[navigationController view]]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 


- (void)applicationWillTerminate:(UIApplication *)application { 
    // Save data if appropriate 
} 


#pragma mark - 
#pragma mark Memory management 

- (void)dealloc { 
    [navigationController release]; 
    [window release]; 
    [super dealloc]; 
} 


@end 

這是con獨家消息:

2012-03-17 17:32:29.498 Rahnavard[1862:12e03] fetch rss 
2012-03-17 17:33:01.212 Rahnavard[1862:f803] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/hassantavari/Library/Application Support/iPhone Simulator/5.1/Applications/48090189-E17C-40CF-9BF1-ACA18FC0B02B/Rahnavard.app> (loaded)' with name 'DetailViewController'' 
*** First throw call stack: 
(0x16e4022 0x1875cd6 0x168ca48 0x168c9b9 0x366638 0x20c1fc 0x20c779 0x20c99b 0x20cd11 0x21e8fd 0x21eaef 0x21edbb 0x21f85f 0x21fe06 0x21fa24 0x393c 0x1d65c5 0x1d67fa 0xa6b85d 0x16b8936 0x16b83d7 0x161b790 0x161ad84 0x161ac9b 0x15cd7d8 0x15cd88a 0x145626 0x26a2 0x2615) 
terminate called throwing an exception(lldb) 

這裏是抓取RSS:

-(void)fetchRss 
{ 
    NSLog(@"fetch rss"); 
    NSData* xmlData = [[NSMutableData alloc] initWithContentsOfURL:[NSURL URLWithString: kRSSUrl] ]; 
    NSError *error; 

    GDataXMLDocument* doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; 

    if (doc != nil) { 
     self.loaded = YES; 

     GDataXMLNode* title = [[[doc rootElement] nodesForXPath:@"channel/title" error:&error] objectAtIndex:0]; 
     [self.delegate updatedFeedTitle: [title stringValue] ]; 

     NSArray* items = [[doc rootElement] nodesForXPath:@"channel/item" error:&error]; 
     NSMutableArray* rssItems = [NSMutableArray arrayWithCapacity:[items count] ]; 

     for (GDataXMLElement* xmlItem in items) { 
      [rssItems addObject: [self getItemFromXmlElement:xmlItem] ]; 
     } 

     [self.delegate performSelectorOnMainThread:@selector(updatedFeedWithRSS:) withObject:rssItems waitUntilDone:YES]; 
    } else { 
     [self.delegate performSelectorOnMainThread:@selector(failedFeedUpdateWithError:) withObject:error waitUntilDone:YES]; 
    } 

    [doc autorelease]; 
    [xmlData release]; 
} 

MasterViewController.h:

#import <UIKit/UIKit.h> 
#import "RSSLoader.h" 
#import "DetailViewController.h" 


@interface MasterViewController : UITableViewController<RSSLoaderDelegate> { 

    RSSLoader* rss; 
    NSMutableArray* rssItems; 

} 



@end 

MasterViewController.m:

#import "MasterViewController.h" 

#import "DetailViewController.h" 




@implementation MasterViewController 

#pragma mark - 
#pragma mark View lifecycle 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.navigationItem.title = @"RAHNAVARD"; 
    self.navigationItem.prompt = @"LATEST NEWS"; 
    rssItems = nil; 
    rss = nil; 

    self.tableView.backgroundColor = [UIColor whiteColor]; 
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 
    [self.tableView setIndicatorStyle:UIScrollViewIndicatorStyleWhite]; 

    //self.tableView.tableHeaderView = [[TableHeaderView alloc] initWithText:@"fetching rss feed"]; 

} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    if (rss==nil) { 
     rss = [[RSSLoader alloc] init]; 
     rss.delegate = self; 
     [rss load]; 
    } 
} 

/* 
- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
} 
*/ 
/* 
- (void)viewDidDisappear:(BOOL)animated { 
[super viewDidDisappear:animated]; 
} 
*/ 

/* 
// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations. 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
*/ 


#pragma mark - 
#pragma mark Table view data source 

// Customize the number of sections in the table view. 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


// Customize the number of rows in the table view. 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (rss.loaded == YES) { 
     return [rssItems count]*2; 
    } else { 
     return 1; 
    } 
} 

- (UITableViewCell *)getLoadingTableCellWithTableView:(UITableView *)tableView 
{ 
    static NSString *LoadingCellIdentifier = @"LoadingCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LoadingCellIdentifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:LoadingCellIdentifier] autorelease]; 
    } 

    cell.textLabel.text = @"Loading..."; 

    UIActivityIndicatorView* activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [activity startAnimating]; 
    [cell setAccessoryView: activity]; 
    [activity release]; 

    return cell; 
} 

- (UITableViewCell *)getTextCellWithTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { 
    static NSString *TextCellIdentifier = @"TextCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TextCellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:TextCellIdentifier] autorelease]; 
    } 

    NSDictionary* item = [rssItems objectAtIndex: (indexPath.row-1)/2]; 

    //article preview 
    cell.textLabel.font = [UIFont systemFontOfSize:11]; 
    cell.textLabel.numberOfLines = 3; 
    cell.textLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7]; 
    cell.backgroundColor = [UIColor clearColor]; 
    cell.textLabel.backgroundColor = [UIColor clearColor]; 

    UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 
    backView.backgroundColor = [UIColor clearColor]; 
    cell.backgroundView = backView; 

    CGRect f = cell.textLabel.frame; 
    [cell.textLabel setFrame: CGRectMake(f.origin.x+15, f.origin.y, f.size.width-15, f.size.height)]; 
    cell.textLabel.text = [item objectForKey:@"description"]; 

    return cell; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (rss.loaded == NO) { 
     return [self getLoadingTableCellWithTableView:tableView]; 
    } 

    if (indexPath.row % 2 == 1) { 
     return [self getTextCellWithTableView:tableView atIndexPath:indexPath]; 
    } 

    static NSString *CellIdentifier = @"TitleCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    UIView *backView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 
    backView.backgroundColor = [UIColor clearColor]; 
    cell.backgroundView = backView; 

    NSDictionary* item = [rssItems objectAtIndex: indexPath.row/2]; 

    cell.textLabel.text = [item objectForKey:@"title"]; 

    return cell; 
} 



/* 
// Override to support conditional editing of the table view. 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
// Return NO if you do not want the specified item to be editable. 
return YES; 
} 
*/ 


/* 
// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

if (editingStyle == UITableViewCellEditingStyleDelete) { 
// Delete the row from the data source. 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
else if (editingStyle == UITableViewCellEditingStyleInsert) { 
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 
} 
} 
*/ 


/* 
// Override to support rearranging the table view. 
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
} 
*/ 


/* 
// Override to support conditional rearranging of the table view. 
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
// Return NO if you do not want the item to be re-orderable. 
return YES; 
} 
*/ 


#pragma mark - 
#pragma mark Table view delegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

    //DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 
    detailViewController.item = [rssItems objectAtIndex:floor(indexPath.row/2)]; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [detailViewController release]; 
} 


#pragma mark - 
#pragma mark Memory management 

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

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

- (void)viewDidUnload { 
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
} 


- (void)dealloc { 
    [rssItems release]; 
    rssItems = nil; 

    [rss release]; 
    rss = nil; 

    [super dealloc]; 
} 

#pragma mark - 
#pragma mark RSSLoaderDelegate 
-(void)updatedFeedWithRSS:(NSMutableArray*)items 
{ 
    rssItems = [items retain]; 
    [self.tableView reloadData]; 
} 

-(void)failedFeedUpdateWithError:(NSError *)error 
{ 
    // 
} 

@end 

如果您想了解更多信息只是對我說通過答案,我會編輯我的問題,然後你會編輯你的答案。

我真的很感激你的幫助。

+6

SIGABRT表示異常被觸發。控制檯日誌將打印確切的異常消息,並且您需要查看(在此處發佈)。 – DarkDust 2012-03-17 13:12:34

+1

嘿,你忘了添加你的Xcode項目文件和xib XML文件。 – Abizern 2012-03-17 23:49:56

回答

9

您正在嘗試加載名爲DetailViewController的XIB,但不存在此類XIB,或者它不是您當前目標的成員。

+1

要添加到此答案 - 您可以按住Ctrl單擊,然後刪除插座。在我的代碼中沒有任何地方,這是我可以刪除它的唯一方法。甚至沒有產品>清潔工作。 – William 2013-02-26 15:43:10

9

SIGABRT通常表示存在未捕獲的異常。控制檯上應該有更多的信息。

0

正如其他答案中所述,SIGABRT是一個未捕獲的常規異常。你一定要多學習一點Objective-C。該問題可能是在您的UITableViewDelegate方法didSelectRowAtIndexPath中。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

我不能告訴你更多,直到你向我們展示了處理表數據源和委託方法的代碼。

+0

你怎麼會認爲這是一個表格視圖,當例外說明無法加載NIB時會導致問題? – DarkDust 2012-03-17 17:21:46

+1

因爲這發生在點擊表格視圖單元格時。但我注意到了另外一件事情 - 您究竟如何呈現新的視圖控制器?如果需要指定捆綁包,請確保您在那裏[NSBundle mainBundle]。而且它也可能是編譯和構建時的錯誤。檢查你的XIB是否有正確的目標,並嘗試清理(Command + Shift + K)並建立清理(Command + Shift + Alt + K)。如果我們能夠看到代碼的哪部分獲取rss並處理觸摸,那將是非常好的。 (至少它的一部分) – 2012-03-17 18:35:10