所以,我有一個自定義類「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爲「值」的菜單項填充,使得當一個項目被選中我可以得到標籤或其中的一個,然後採取相應的行動。
任何人都可以指向正確的方向嗎?
謝謝!
我覺得你的做法是稍微偏離。首先創建一個模型來包含來自sqlite3數據庫的數據。這個提取只能完成一次。然後創建一個實現'NSMenuDelegate'協議的對象,並設置彈出式按鈕菜單委託來使用這個對象。它可以將您的模型數據轉換爲菜單。 – trojanfoe