2013-10-21 145 views
1

所以,我有一個自定義類「BackupIncrement」,它從sqlite3數據庫獲取其數據,並且工作得很好。我也有一個叫做「pubDefaultIncrement」的NSPopUpButton,它被連接到IB以編程方式將菜單+項目添加到NSPopupButton

最終結果是,我希望popupbutton填充有意義的標題,並且還要使用每個menuitem或值爲數據庫中的增量id(主鍵)。

這裏是有問題的代碼:

- (void)doAddItemsTopubDefaultBackupIncrement { 
    marBackupIncrement = [[NSMutableArray alloc] init]; 
    pubDefaultIncrement = [[NSPopUpButton alloc] init]; 
    [pubDefaultIncrement removeAllItems]; 
    mnuBackupIncrement = [[NSMenu alloc] init]; 
    const char* chrSQLSelect = "SELECT * FROM _backup_increments"; 
    sqlite3_stmt* compiledSQL; 
    if (sqlite3_prepare_v2(claAppDelegate.sl3Database, chrSQLSelect, -1, &compiledSQL, NULL) == SQLITE_OK) { 
     while (sqlite3_step(compiledSQL) == SQLITE_ROW) { 

      BackupIncrement* bi = [[BackupIncrement alloc] 
          initWithintIncrementId:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledSQL, 0)] 
          AndstrIncrementValue:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledSQL, 1)] 
          AndstrIncrementDescription:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledSQL, 2)]]; 
      NSMenuItem* mi = [[NSMenuItem alloc] 
          initWithTitle:[bi strIncrementValueDescription] 
          action:Nil 
          keyEquivalent:[bi strIncrementValue]]; 
      [mi setTarget:self]; 
      [mi setRepresentedObject:bi]; 
      [mi setTag:[[bi intIncrementId] integerValue]]; 
      [mnuBackupIncrement addItem:mi]; 
      NSLog(@"Menu Item: %@", mi); 
      NSLog(@"Menu Item Title: %@", [mi title]); 
      NSLog(@"Menu Item Tag: %ld", (long)[mi tag]); 
      //[[pubDefaultIncrement menu] addItem:mi]; 
      //[marBackupIncrement addObject:bi]; 
     } 
    } 
    //NSLog(@"%@", mnuBackupIncrement); 
    //[pubDefaultIncrement setTarget:self]; 
    [[pubDefaultIncrement menu] setSupermenu:mnuBackupIncrement]; 
    [pubDefaultIncrement setMenu:mnuBackupIncrement]; 
} 

的SQL的作品,它循環5次提取每一行從sqlite3的表。

此:

NSLog(@"%@", mnuBackupIncrement); 

打印出與它裏面的5菜單項的對象菜單對象。

但是,當我運行我的項目代碼popupbutton有3件事情。

1st: a blank item 
2nd: Item 2 
3rd: Item 3 

我本來有ArrayController和綁定嘗試這一點,但我不能似乎得到標記每個菜單項才能正常工作。如果這是做到這一點的方法,我會很樂意聽到綁定的正確方法。

Just f.y.i.所述BackupIncrement對象公開4個性能:

intIncrementId: the primary key from the table (1-5 currently for the 5 rows) 
strIncrementValue: the single letter value from the table (h, d, w, m, y) 
strIncrementDescription: the desc for the value (hour, day, week, month, year) 
strIncrementValueDescription: a combination of the previous two - e.g. "d (day)", "m (month)" 

所以再次 - 理想ID具有NSPopUpButton與具有strIncrementValueDescription作爲可見的「內容」以及相應的intIncrementId爲「值」的菜單項填充,使得當一個項目被選中我可以得到標籤或其中的一個,然後採取相應的行動。

任何人都可以指向正確的方向嗎?

謝謝!

+0

我覺得你的做法是稍微偏離。首先創建一個模型來包含來自sqlite3數據庫的數據。這個提取只能完成一次。然後創建一個實現'NSMenuDelegate'協議的對象,並設置彈出式按鈕菜單委託來使用這個對象。它可以將您的模型數據轉換爲菜單。 – trojanfoe

回答

2

事實證明(再次)我的問題是時間問題。我打電話從視圖控制器的initWithNibName內討論的功能...

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Initialization code here. 
     if (!claAppDelegate) { 
      claAppDelegate = [[AppDelegate alloc] init]; 
     } 
     //[self doAddItemsTopubDefaultBackupIncrement]; <--- HERE doesn't work.... 
    } 
    return self; 
} 

當代替我應該已經後調用它的視圖控制器已經被加載:

- (void)loadView { 
    [self viewWillLoad]; 
    [super loadView]; 
    [self viewDidLoad]; // <-- call in here instead 
} 

- (void)viewDidLoad { 
    [self doAddItemsTopubDefaultBackupIncrement]; //<-- HERE: works just fine... 
    [pubDefaultIncrement selectItemWithTag:claAppDelegate.intDefaultBackupIncrmentId]; 
} 
相關問題