0

我已经创建了一个名为 DBcontrols 的模型类,我正在尝试在多个视图中使用它。(我仍在尝试在 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.hlistTableVC.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.mlistTableVC.m中都被合成

这是故事板:

在此处输入图像描述

Contacts TableVC, listTableVC是enterView导航栏上的List按钮的Push off 。

所有编译成功,但在 enterView 中调用了 DBcontrols 方法但在listTableVC中没有。例如,在enterViewlistTableVC中,我都使用了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调用它时,它永远不会响应。我究竟做错了什么?
谢谢!

4

2 回答 2

2

didFinishLaunchingWithOptions:secondViewController不存在。控制器是惰性创建的;也就是说,在需要时并且仅在从 firstViewController 开始转换时才需要。

在故事板上下文中,您通常使用“传递”值

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
{
  enterView   *source = segue.sourceViewController;
  listTableVc *target = segue.destinationViewController;

  target.dataController = source.dataController;
}
于 2013-07-11T23:32:00.180 回答
0
listTableVC *secondViewController = (listTableVC *)[[navigationController viewControllers] objectAtIndex:0];

应该是:

listTableVC *secondViewController = (listTableVC *)[[navigationController viewControllers] objectAtIndex:1];

?

于 2013-07-11T20:24:24.903 回答