2010-06-24 6 views
0

내 데이터는 뷰 컨트롤러의 멤버 변수 (NSArray)에 저장됩니다. 내가 겪고있는 문제는 응용 프로그램 실행시 데이터가 데이터베이스에서로드되지만 나중에 NSArray가 초기화되지 않으므로 자동으로 addObject 호출이 실패합니다.응용 프로그램 시작시 참조되는 뷰 컨트롤러 초기화

내보기 컨트롤러 (SafeTableViewController)의 init, initWithNibName, viewWillAppear 및 viewDidLoad 메서드에 중단 점을 넣으려고 시도했지만 그 중 아무 것도 addObject 호출 전에 catch하지 않습니다. 디버거에서 볼 때 0이 아닌 주소를 가지기 때문에 addObject가 호출 될 때 NSArray의 주소가 0x0이므로 실제 뷰 컨트롤러가 초기화되었다고 가정합니다. SafeTableViewController.m에서

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    databaseName = @"DubbleDatabase.sql"; 

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 

    [self checkAndCreateDatabase]; 

    [self readSafeItemsFromDatabase ]; 

    // Add the tab bar controller's current view as a subview of the window 
    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 
- (void) readSafeItemsFromDatabase { 
    // some code skipped here, but basically: open sqlite3 database, iterate through rows 

      while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
       // read database, get data fields out 

       SafeItem *safeItem = [[SafeItem alloc] initWithName:aName price:aPrice category:aCategory]; 

       [safeTableViewController addItemToSafe: safeItem]; // PROBLEM HERE 

       [safeItem release]; 
      } 
    } 
    sqlite3_close(database); 
} 

:

- (void) addItemToSafe : (SafeItem*) newSafeItem { 
    [self.safeItems addObject: newSafeItem]; 
} 

// I put a breakpoint on this, but it does not hit. i.e. safeItems is not initialized when addObject is called on it. 
-(id) init { 
    if(self = [super initWithNibName:@"SafeTableViewController" bundle:nil]){ 
     self.safeItems = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

편집 :이 문제를 해결하는 방법의 생각. 여전히 궁금한 점이 있습니다 : init 및/또는 initWithNibName은 언제 호출됩니까? 다음은 제안 된 솔루션입니다.

- (void) addItemToSafe : (SafeItem*) newSafeItem { 
    if(self.safeItems == nil){ 
     self.safeItems = [[NSMutableArray alloc] init]; 
    } 
    [self.safeItems addObject: newSafeItem]; 
} 

답변

1

SafeTableViewController 인스턴스를 어떻게 설정합니까? 코드? 펜촉으로?

-(id) init은 지정된 초기화 프로그램이 아닙니다.

당신은 아마

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle { 
    if(self = [super initWithNibName:nibName bundle:nibBundle]){ 
     self.safeItems = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

를 사용하거나 viewDidLoad에 즉, 다른 곳에서 초기화합니다.

+0

나는 이것이 옳다고 생각합니다. 다른 답변에서 제안 된대로 분리 된 관리자로 데이터를 이동 시키지만, 사용하고 있기 때문에 되돌아 보았습니다. nib 파일은'init' 대신'initWithNibName'을 호출해야합니다. 고마워요. – unsorted

1

문제는 뷰 컨트롤러에 데이터를 저장하면 안된다는 것입니다. 데이터를 보유 할 모델 객체 (예 : SafeItemManager)를 만들고 뷰 컨트롤러를 가리 킵니다.

+0

괜찮습니다. SafeItemManager를 만들었습니다. 이 UITableView의 데이터 소스를 만드는 것이 좋습니다 것이겠습니까? (그런 다음 tableView : commitEditingStyle : forRowAtIndexPath :와 같은 메서드를 모두 SafeItemManager에 옮기면 SafeItemManager는 순수 데이터 객체처럼 느껴집니다. – unsorted

+0

아니요, ViewController가 데이터 소스 여야하며 SafeItemManager를 쿼리해야합니다. SIM은 이제 순수한 데이터 객체입니다. –

관련 문제