2013-08-01 2 views
1

사용자 정의 탭 막대를 만든 iOS 응용 프로그램을 빌드하려고합니다. UIView에서 같은보기 컨트롤러에서 UIView의 내용을로드하는 버튼이 다릅니다.스크롤 할 때 응용 프로그램이 충돌 함 - EXC_BAD_ACCESS

일부보기에서는 UITableView를 삽입했습니다. 모든 셀이 올바르게 표가로드됩니다. 단, 스크롤 할 때 EXC_BAD_ACCESS 오류가 발생하는 것을 제외하면 제대로 인쇄됩니다. 나는 더 많은 정보를 얻기 위해 좀비를 활성화 나는 다음과 같은 메시지가 얻을 : 는 "FirstTabBarController가 responsToSelector] :. 메시지 할당이 해제 된 경우 0x75d79d0

로 전송 나는이 문제를 해결하는 방법을 알아낼 수 없습니다를 여기

조금이다 하여 응용 프로그램의 구조에 대한 자세한 :

.H 파일 :

#import <UIKit/UIKit.h> 

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

@end 
MainViewController에서 , 나는 TabBar의를 복제 할 내용을로드하기 위해 다른 UIViewControllers에서 데이터를 가져옵니다 UIView의이

#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가 내 FirstTabBarViewController을 SEGUE 사용자 정의로로드 할 때 0

, 나는 나던 스크롤이 표를 얻을. 이 같은 사용자 정의 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

앱 위임자에서 UIWindow의 rootViewController로 탭 표시 줄 컨트롤러를 설정했는지 확인하십시오. 그렇지 않으면 유지되지 않을 수도 있고 didFinishLaunching 후에 해제되어 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 메서드에서 @ "@"를 제거해야했습니다. 그렇지 않으면 컴파일되지 않습니다. 릴리스 기능을 사용할 수 없습니다 : "릴리스를 사용할 수 없습니다", "ARC는 명시 적으로"릴리스 "" – Spearfisher

+0

예 ... 메시지 전송을 금지합니다. 그러나 프로젝트에서 ARC를 사용했는지 여부를 알지 못했습니다. :-) – hpp

+0

저는 ARC에 매우 익숙합니다 :) 이 작업을 수행하는 다른 빠른 수정본이 있습니까? – Spearfisher

0

@Arnuad

가있는 TableView이 범위를 벗어나 점점이 정확한 경우입니다. 나는 절대적으로 잘 작동하는 해결책을 찾았습니다. 당신의 customTabBarSegue 파일에서

가 수행 방법 의 끝 부분에 다음 코드를 작성 :

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

에서 데이터 소스 및 위임 메소드를 구현 MainViewController는

희망이 당신을 도울 것입니다 .

0

@Arnuad

다른 더 나은 솔루션을 발견.

그냥 MainViewControllercurrentViewController 강한 대신에 약한의 속성을 확인하십시오.