我有一个自定义类“ BackupIncrement”,该类从sqlite3数据库获取数据,并且工作正常。我还有一个NSPopUpButton
名为“ pubDefaultIncrement”的挂钩IB
。
最终结果是,我希望popupbutton
使用有意义的标题以及每个menuitem
or值作为数据库的增量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和Bindings进行此操作,但似乎无法使每个菜单项的标签正常工作。如果这样做是这样做的,那么我很乐意听取绑定的正确方法。
恰好,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为“值”,这样当一个项目被选中,我可以得到的标签或任何一个然后采取相应的行动的菜单项。
谁能指出我正确的方向?
事实证明(再次),我的问题是一个时机。我正在从ViewController的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;
}
相反,当ViewController加载后我应该一直调用它时:
- (void)loadView {
[self viewWillLoad];
[super loadView];
[self viewDidLoad]; // <-- call in here instead
}
- (void)viewDidLoad {
[self doAddItemsTopubDefaultBackupIncrement]; //<-- HERE: works just fine...
[pubDefaultIncrement selectItemWithTag:claAppDelegate.intDefaultBackupIncrmentId];
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句