我制作了一个名为DBcontrols的Model类,并试图在多个视图中使用它。 (我仍在尝试在iOS上学习适当的MVC技术。)但是第二个视图(TableVC)没有用。我很确定我的问题出在应用程序Delegate上,这里称为dBAppDelegate.m:
#import "dBAppDelegate.h"
// Controller Class
#import "DBcontrols.h"
// View Classes
#import "enterView.h"
#import "listTableVC.h"
@implementation dBAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
enterView *firstViewController = (enterView *)[[navigationController viewControllers] objectAtIndex:0];
listTableVC *secondViewController = (listTableVC *)[[navigationController viewControllers] objectAtIndex:0];
DBcontrols *aDataController = [[DBcontrols alloc] init];
firstViewController.dataController = aDataController;
secondViewController.dataController = aDataController;
return YES;
}
enterView.h和listTableVC.h都具有以下代码:
#import <UIKit/UIKit.h>
@class Contacts;
@class DBcontrols;
either: @interface enterView: UIViewController
or: @interface listTableVC: UITableViewController
@property (strong, nonatomic) DBcontrols *dataController;
. . .
@end
并且那个dataController是在enterView.m和listTableVC.m中综合的
这是情节提要:
Contacts TableVC,listTableVC,作为enterView导航栏上List按钮的下推按钮。
所有编译成功,但是DBcontrols方法在enterView中调用,但不在listTableVC中调用。例如,在enterView和listTableVC中,我都使用countContacts方法:
- (NSUInteger)countContacts {
nC = 0;
const char *dbpath = [_databasePath UTF8String];
if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) {
NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM contacts"];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(_contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
nC++;
}
}
}
NSLog(@"%d contacts in dB.", nC );
return [self.masterContactList count];
}
从listTableVC调用此方法时,它从不响应。
我究竟做错了什么?
谢谢!
最佳答案
在didFinishLaunchingWithOptions:
中secondViewController
尚不存在。控制器是延迟创建的;也就是说,在需要的时候,并且只有在从firstViewController发起转换时才需要它。
在情节提要板上下文中,通常使用“传递”值
- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
{
enterView *source = segue.sourceViewController;
listTableVc *target = segue.destinationViewController;
target.dataController = source.dataController;
}