2013-08-01 2 views
1

Я пытаюсь создать приложение iOS, в котором я создал пользовательскую панель вкладок: В UIView у меня есть разные кнопки, загружающие содержимое UIView в тот же контроллер вида.Ошибка приложения при прокрутке - EXC_BAD_ACCESS

В некоторых представлениях я вставил UITableView. Таблица загружается просто отлично, все ячейки печатаются правильно, за исключением того, что при прокрутке я получаю ошибку EXC_BAD_ACCESS. я включил зомби, чтобы получить больше информации, и я получаю следующее сообщение: «FirstTabBarController responsToSelector]. Сообщение отправлено на высвобождены, например 0x75d79d0

Я не могу понять, как это исправить

Вот немного больше на структуре приложения: в MainViewController, у меня есть UIView, который получает данные из различных UIViewControllers для загрузки содержимого для репликации TabBar:

.h файл:

#import <UIKit/UIKit.h> 

@interface MainViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIView *placeholderView; 
@property (weak, nonatomic) UIViewController *currentViewController; 

@end 

Когда я загружаю с обычаем моего FirstTabBarViewController непосредственно перейти, я получаю таблицу, которая оленья кожа прокрутки:

#import <UIKit/UIKit.h> 
#import "DataController.h" 

@interface FirstTabBarViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 
    IBOutlet UITableView* tabBarTable; 
} 

@property (strong, nonatomic) IBOutlet UIView *mainView; 
@property (strong, nonatomic) IBOutlet UITableView *tabBarTable; 
@property (nonatomic, strong) DataController *messageDataController; 

@end 

.m файл:

#import "FirstTabBarViewController.h" 
#import "DataController.h" 

@interface FirstTabBarViewController() 

@end 

@implementation FirstTabBarViewController 
@synthesize tabBarTable=_tabBarTable; 

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    self.messageDataController=[[DataController alloc] init]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [self.messageDataController countOfList]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"mainCell"; 
    UITableViewCell *cell = [tableView 
          dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    }; 

    NSString *expenseAtIndex = [self.messageDataController 
            objectInListAtIndex:indexPath.row]; 
    [[cell textLabel] setText:expenseAtIndex]; 
    return cell; 
} 


- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the specified item to be editable. 
    return NO; 
} 

@end 

Класса DataController является простым NSMutableArray, содержащие строки. Заказные SEGUE действует как это:

#import "customTabBarSegue.h" 
#import "MainViewController.h" 

@implementation customTabBarSegue 

-(void) perform { 
    MainViewController *src= (MainViewController *) [self sourceViewController]; 
    UIViewController *dst=(UIViewController *)[self destinationViewController]; 

    for (UIView *view in src.placeholderView.subviews){ 
     [view removeFromSuperview]; 
    } 

    src.currentViewController =dst; 
    [src.placeholderView addSubview:dst.view]; 



} 
@end 

Большое спасибо за вашу помощь, это очень ценится.

ответ

0

Проверьте, настроен ли ваш контроллер панели вкладок как rootViewController UIWindow в делегате приложения. В противном случае он может не сохраниться, и после того, как doneFinishLaunching будет выпущен, вы получите EXC_BAD_ACCESS.

Я видел, как люди используют устаревшие шаблоны для проектов, которые по-прежнему имеют старый вариант, где они только добавляют представление окна счетчика панели вкладок. Это больше не работает с iOS 6.

0

в вашем коде заменить следующий метод:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"mainCell"; 
    UITableViewCell *cell = [tableView 
          dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    }; 

    NSString *expenseAtIndex = [self.messageDataController 
            objectInListAtIndex:indexPath.row]; 
    [[cell textLabel] setText:expenseAtIndex]; 
    return cell; 
} 

с следующим методом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
     static NSString *CellIdentifier = @"mainCell"; 
     UITableViewCell *cell = [tableView 
           dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil){ 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     }; 

     NSString *expenseAtIndex = [[NSString alloc] initWithString:@"%@",[self.messageDataController objectInListAtIndex:indexPath.row]]; 
     [[cell textLabel] setText:expenseAtIndex]; 

     return cell; 
    } 

я надеюсь, что это поможет.

+0

привет, спасибо за помощь. К сожалению, это не сработало. Мне пришлось удалить @ "@" в методе initWithString, иначе он не будет компилироваться. Я не мог использовать функцию release: «релиз недоступен», «ARC запрещает явное сообщение« release »« – Spearfisher

+0

yeh ... но я не знал, что вы использовали ARC в своем проекте. :-) – hpp

+0

Я очень новичок в ARC :) Есть ли еще какое-то быстрое решение, чтобы сделать эту работу? – Spearfisher

0

@Arnuad

Как указано в моем предыдущем посте, TableView выходит за рамки, и это точно так. Я нашел решение для того, что работает абсолютно нормально.

В вашем файле customTabBarSegue, напишите следующий код в конце выполнить метод:

dst.dashboardTable.delegate = src; 
dst.dashboardTable.dataSource = src; 

и осуществлять DataSource и делегировать методы в MainViewController

Надеется, что это поможет ,

0

@Arnuad

Нашел еще одно лучшее решение.

Просто сделайте свойство currentViewController так силен вместо слабого в MainViewController.

Смежные вопросы